tinnu

  • 2019-06-23
  • 发表了主题帖: 水位测量语音报警装置

    本帖最后由 tinnu 于 2019-6-23 23:39 编辑 一、简介 水位测量语音报警装置的开发基于兆易创新GD32E231C-START评估板。能够对水位进行测量、显示、语音警告、上报云端。适合雨量计数器、小水缸等盛装液体的容器的物联网监控。 二、系统框图 三、系统框图 显示系统1602+PCF8574   1602+PCF8574组成的显示模块可以实现两个IO口控制显示功能,其协议总吸为I2C总线。 JQ8400+喇叭 JQ8400是佳强电子的一款即语音存储与解码播放为一体的MP3模块,通过UART接口可以实现语音播放。 ESP8266 ESP8266是乐鑫的无线WIFI SOC,是目前市面上最常见的DIY无线模块,其中上图的ESP8266-01是常见的低成本模块,通过串口通讯,可以快速实现网络连接。ESP8266固件多样,可以刷入不同的物联网固件接入对应的云端网络。本项目接入的中移云,其基于HTTP协议,通过透传+JSON信息实现,只需要普通的AT指令集便可实现。 其底座是一块ESP01 Breakout扩展版,使ESP8266-01可以插在面包板上。由于ESP8266工作时必须对CHPD接口进行上拉,否则不会工作,因此插在面包板上更容易配置电路连接。 DS3231 DS3231是一款高精度、带补偿的时钟芯片,其内置晶振,常温精度小于3.8ppm,宽温补偿,ID码,电池充电及电量监测等一系列功能。 在开发过程中,由于没有注意到GD32E231带有强大的RTC日历时钟,因此临时采用该模块实现时钟功能。后来把时钟功能转移到RTC后,DS3231就只负责初始化配置RTC时钟的功能。由于没有重新绘制PCB、设置低功耗时钟供电系统,因此外挂低功耗日历时钟模块是必须的,但该模块基于IIC总线,读取远比内部总线的RTC要慢,因此运行过程中采用内部RTC。 事实上可以采用ESP8266握手Onenet时的网络数据包中的网络时间戳对时钟进行初始化,但考虑到网络信号可能不一定可靠,因此还是暂时采用外挂模块的形式。 water sensor water sensor传感器可以将目前水位线转化成模拟信号量,反馈给单片机,通过ADC采样可以确定液面的高低。 四、效果演示 整体图: 视频演示(其中语音播报的声音有点小,但仔细听还是听得到的):   五、工程代码及doc附件 工程采用MDK5.27开发 工程代码: DOCX文档:

  • 2019-06-21
  • 发表了主题帖: 【GD32E231 DIY】RTC开发

    (一)GD32E231的RTC 与常见的秒计数器不同,GD32E231的RTC模块提供了一个包含日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能,无需用户自己实现日历算法。 通过读取寄存器可以直接得到时间和日历的值: (二)时钟源配置 RTC的时钟源有三个:内部40K时钟,外部32.768K,内部高速时钟32分频 通常采用内部40K最为方便,因为通常外部的32.768K时钟兼顾低功耗功能,起振比较困难。 上图还可以看到这里有两个分频器:异步7位分频器FACTOR_A,产生时钟ck_apre;同步15位分频器FACTOR_S,产生时钟ck_spre。 最终的时钟频率要做到同步分频器出来刚好是1Hz。他们的计算公式: 数据手册提到,异步分频器对功耗控制更加严格,应该尽量加大异步分频器的数值,因此这里设置异步分频器为100-1,同步分频器则为400-1. 初始化代码: /* enable access to RTC registers in backup domain */ rcu_periph_clock_enable(RCU_PMU); pmu_backup_write_enable(); /* enable the IRC40K oscillator */ rcu_osci_on(RCU_IRC40K); /* wait till IRC40K is ready */ rcu_osci_stab_wait(RCU_IRC40K); /* select the RTC clock source */ rcu_rtc_clock_config(RCU_RTCSRC_IRC40K); rcu_periph_clock_enable(RCU_RTC); rtc_register_sync_wait(); rtc_init(&rtc_initpara); 其中rtc_initpara是RTC里面最重要的结构体,我们可以在固件库手册里面找到它: 这里定义这个结构体: rtc_parameter_struct rtc_initpara= {0x18,RTC_DEC,0x01,RTC_SATURDAY, 0x10,0x0,0x0, 0x63,0x18F, RTC_AM,RTC_24HOUR}; 其中asyn、syn就是上述的分频器设置参数(手册的异步打错字了)   (三)时间校准 RTC是可以实现低功耗的,其低功耗供电通过VDD(即JP8排阵第三个针脚)供电,但由于目前没有额外设置低功耗,因此没有采用电池低功耗供电,因此上电需要校准。为此额外外挂了一个DS3231。 可能使用了DS3231再使用RTC有点多次一举。但实际上RTC是芯片内部总线访问,比通过IIC外部总线访问快得多。 ReadTimeDS3231(); rtc_initpara.rtc_second = HEX2BCD(m_Timestrct.sec); rtc_initpara.rtc_minute = HEX2BCD(m_Timestrct.min); rtc_initpara.rtc_hour = HEX2BCD(m_Timestrct.hour); rtc_initpara.rtc_date = HEX2BCD(m_Timestrct.data); rtc_pre_config();   (四)运行效果 使用1602显示时间: rtc_current_time_get(&rtc_initpara); sprintf(t_strReportTemp, "%2x:%2x:%2x-%2x", rtc_initpara.rtc_hour, rtc_initpara.rtc_minute, rtc_initpara.rtc_second, rtc_initpara.rtc_date); ShowString(2,1, (unsigned char *)t_strReportTemp); 效果:

  • 2019-05-18
  • 加入了学习《黑科技探头:碰一下就知电流大小(英文)》,观看 黑科技探头:碰一下就知电流大小(英文,国外网友评测)

  • 2019-05-17
  • 回复了主题帖: GD32E231 DIY大赛(7)——人体红外传感模块及音乐IC驱动完成

    我之前弄mp4模块的时候,为了做低功耗也搞过开关电路停掉mp4模块供电,结果一加8050做的开关电路,mp4模块运放出来的声音就不正常,后来改用光耦IC pc817,直接就没声音出来了。最后没办法,用了一个庞大的蓝色光耦,那种会咔嗒响的那种。不知道你这个9015的电路用多少的电阻?我也想试试

  • 2019-04-01
  • 发表了主题帖: 【GD32E230】 EVAL板子工程创建、点灯

    本帖最后由 tinnu 于 2019-4-1 20:20 编辑 (一)创建工程 工程采用与demo包GD32E230_Demo_Suites_V1.0.1内的函数库。 从keil5安装目录内复制m23架构的头文件到工程下面: (二)main函数 main内,采用跟GPIO灯的demo一样的初始化。官方工程的代码与之区别不大,就是官方工程初始化了四个灯轮流闪烁,我只初始化了一个。 int main(void) {         // configure the systick         systick_config();                  // enable the led clock         rcu_periph_clock_enable(RCU_GPIOA);         // configure led GPIO port         gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_12);         gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);         //GPIO_BC(GPIOA) = GPIO_PIN_10;         gpio_bit_set(GPIOA, GPIO_PIN_12);         while(1){                 delay_ms(1000);                 gpio_bit_set(GPIOA, GPIO_PIN_12);                 delay_ms(1000);                 gpio_bit_reset(GPIOA, GPIO_PIN_12);         } } 复制代码 (三)现象 在仿真状态下可以顺利点亮led,但退出仿真的时候会出错,只能用任务管理器关掉keil 如果直接复位,无法运行,灯不会被点亮。 但这些问题,在直接使用官方的GPIO灯demo并不会出现。 我已经确保所有的库、系统文件都一模一样…… 工程: (四)解决 经过多番尝试,最终发现是m23架构的头文件的问题,不能够直接复制头文件,而是要创建工程的时候连接keil库

  • 2019-03-04
  • 回复了主题帖: 四轴视觉机械臂——基于F350下位机

    bqgup 发表于 2018-11-19 19:53 舵机光耦隔离原理图
    对了,这个光耦IC是用什么型号的?

  • 2019-02-28
  • 回复了主题帖: CC3200套件OURS-SDK-WFB_探索5——初探wlan

    alan000345 发表于 2019-2-26 09:16 不错,学习啦,ti好像主推这个呢,可惜没申请到啊,加油啊,跟你一起学习学习。
    唉,尽力吧。不过最近在春招,身为学机械的跟一群学电子的争压力好大……最近没怎么搞这块板子了

  • 2019-02-21
  • 发表了主题帖: CC3200套件OURS-SDK-WFB_探索5——初探wlan

    本帖最后由 tinnu 于 2019-2-21 19:05 编辑 此内容由EEWORLD论坛网友tinnu原创,如需转载或用于商业用途需征得作者同意并注明出处 (一)导入工程 导入工程可以直接导入源码,也可以重新创建工程,把头文件路径和库路径填上,heap size修改好,具体参考前面的帖子,这里不赘述了。 值得注意的是,wlan工程需要用到simplelink库,而编译simplelink库实现需要编译好middleware库。 (二)运行错误 我自己创建的工程在运行过程中一直卡在sl_start函数里面: 具体是这个函数里面: API文档中没有关于这个函数的描述,只有sl_start函数:
    Start the SimpleLink device. This function initialize the communication interface, set the enable pin of the device, and call to the init complete callback. Parameters [in]        pIfHdl        Opened Interface Object. In case the interface must be opened outside the SimpleLink Driver, the user might give the handler to be used in any access of the communication interface with the device (UART/SPI). The SimpleLink driver will open an interface port only if this parameter is null! [in]        pDevName        The name of the device to open. Could be used when the pIfHdl is null, to transfer information to the open interface function This pointer could be used to pass additional information to sl_IfOpen in case it is required (e.g. UART com port name) [in]        pInitCallBack        Pointer to function that would be called on completion of the initialization process. If this parameter is NULL the function is blocked until the device initialization is completed, otherwise the function returns immediately. Returns Returns the current active role (STA/AP/P2P) or an error code: ROLE_STA, ROLE_AP, ROLE_P2P in case of success, otherwise in failure one of the following is return: ROLE_STA_ERR (Failure to load MAC/PHY in STA role) ROLE_AP_ERR (Failure to load MAC/PHY in AP role) ROLE_P2P_ERR (Failure to load MAC/PHY in P2P role) See also sl_Stop Note belongs to basic_api Warning This function must be called before any other SimpleLink API is used, or after sl_Stop is called for reinit the device
    直接导入工程后,却能够正常运行。 找了很久没发现配置文件有任何值得考虑的出入之处,只能怀疑是否是debug的原因(自己创建的工程是debug,而导入的工程是release) 于是乎ALT+ENTER——build——设置为release 设置了之后也没有仔细看,运行之后能够跑出sl_start函数,基本能够正常运行。 但这时候仔细一看才发现工程依然是debug,没有改成release,点进去仔细看才发现设置release要额外点击: 那这就很奇怪了,明明什么都没有修改为什么突然就可以了呢?一直没找到原因…… (三)wpa2加密的wifi获取ip失败 一开始我使用手机发射wpa2热点,程序能正常运行到获取ip之前,手机上也是显示连接进来,但没有分配ip。 于是乎我打开common,发现如下代码段。 #define SSID_NAME           "hahaha"    /* AP SSID */ #define SECURITY_TYPE       SL_SEC_TYPE_WPA    /* Security type (OPEN or WEP or WPA*/ #define SECURITY_KEY        "12345678"              /* Password of the secured AP */ #define SSID_LEN_MAX        32 #define BSSID_LEN_MAX       6复制代码 把里面的SL_SEC_TYPE_WPA改为SL_SEC_TYPE_WPA_WPA2,结果依然不行…… 折腾了一会,我才发现SL_SEC_TYPE_WPA和SL_SEC_TYPE_WPA_WPA2的定义是: #define SL_SEC_TYPE_WPA  (2) /* deprecated */ #define SL_SEC_TYPE_WPA_WPA2 (2)复制代码 没办法,只能设置为OPEN模式:SL_SEC_TYPE_OPEN 终于能够获取IP了!

  • 加入了学习《新版RTOS教程:15天入门RT-Thread内核》,观看 动态内存堆的使用

  • 加入了学习《新版RTOS教程:15天入门RT-Thread内核》,观看 初识RT-Thread

  • 2019-02-20
  • 发表了主题帖: CC3200套件OURS-SDK-WFB_探索4——freertos跑起来

    本帖最后由 tinnu 于 2019-2-20 15:37 编辑 此内容由EEWORLD论坛网友tinnu原创,如需转载或用于商业用途需征得作者同意并注明出处 延续上一章帖子的内容:CC3200套件OURS-SDK-WFB_探索3——freertos移植失败 (一)问题解决 把heap size调大就行了。 我创建了两个任务函数,堆栈都是2048,对应十六进制为0x800.所以最小需要0x1600: 重新编译就能正常运行了 钩子函数vApplicationMallocFailedHook处理的是内存分配错误的问题,由于之前这里设置的是0x00,无法分配内存导致运行不起来。我尝试设置为0x800,只有第一个函数跑起来了 (二)关于例程导入的方法 参考:https://blog.csdn.net/lvyshanwm/article/details/46523697 需要下载sys-bios、ti-rtos两个包

  • 2019-02-06
  • 发表了主题帖: CC3200套件OURS-SDK-WFB_探索3——freertos移植失败

    此内容由EEWORLD论坛网友tinnu原创,如需转载或用于商业用途需征得作者同意并注明出处 原本以为freertos移植挺简单的,结果一下就被打脸了。 与常见的freertos移植不同,ti例程里面移植没有使用systick定时器(可能在汇编文件里面使用了,我没看出来)这导致我完全无法像在st和nxp平台那样顺手,只能完全按着例程来……毕竟人家使用的时基是什么都不知道,就更别说自己捣鼓了。 移植的工程完全按照例程里面的freertos_demo来: 移植 1、include选项卡设置: 2、加入库: 如果不想用官方给你做好的freertos库,可以加入以下文件,经过验证,这些文件的效果和.a库是一样的,虽然都不能成功运行,但编译没有错误,运行都是卡在vApplicationMallocFailedHook这个内存分配的钩子函数里面: 3、全局声明 4、工程目录文件 mian是使用freertos_demo的例程,这个例程对于套件例程和官方的launchpad例程是一样的 运行结果: 能够正常初始化,但一旦调用了os相关的函数: osi_MsgQCreate(&MsgQ, "MSGQ", MAX_MSG_LENGTH, 10);复制代码 或者xTaskCreate初始化创建任务并分配内存的函数,就会进入vApplicationMallocFailedHook这个钩子函数。 void vApplicationMallocFailedHook() {     //Handle Memory Allocation Errors     while(1)     {     } }复制代码 一些挣扎: 由于钩子函数vApplicationMallocFailedHook主要是针对内存分配出错,所以尝试过调大configTOTAL_HEAP_SIZE和各个任务的堆栈,但都无补于事 一些猜想: 由于无论调用什么内存分配函数都会产生内存分配的错误,初步怀疑是freertos+ccs的例程在内存分配上有问题。ccs一般都是配合ti_rtos的,freertos趟坑的人少,本身存在bug也不奇怪。 不过也只是猜想而已,本身freertos的功底小半桶水见底,连时基怎么产生的也没看出来: 1、用ctrl+H搜过systick相关字符,真的一个函数都没有 2、也没有发现有哪里调用了xPortSysTickHandler 3、也没发现调用了其他定时器 编译通过,但无法分配内存的freertos工程:

  • 发表了主题帖: CC3200套件OURS-SDK-WFB_探索2

    本帖最后由 tinnu 于 2019-2-6 22:18 编辑 此内容由EEWORLD论坛网友tinnu原创,如需转载或用于商业用途需征得作者同意并注明出处 (一)函数库问题 OURS-SDK-WFB套件本身自带了一个sdk包,这个TI官网下载下来的sdk包非常类似,但经过自己研究还是有些出入的 官方自带的example跟套件自带的example尤其明显,打开common里面的gpio_if文件,就可以看到两者对三个rgb灯的端口定义不一样: 官方定义,用于launch_pad板 //***************************************************************************** // Variables to store TIMER Port,Pin values //***************************************************************************** unsigned int g_uiLED1Port = 0,g_uiLED2Port = 0,g_uiLED3Port = 0; unsigned char g_ucLED1Pin,g_ucLED2Pin,g_ucLED3Pin; #define GPIO_LED1 9 #define GPIO_LED2 10 #define GPIO_LED3 11复制代码 OURS-SDK-WFB套件的定义: //***************************************************************************** // Variables to store TIMER Port,Pin values //***************************************************************************** unsigned int g_uiLED1Port = 0,g_uiLED2Port = 0,g_uiLED3Port = 0; unsigned char g_ucLED1Pin,g_ucLED2Pin,g_ucLED3Pin; #define GPIO_LED1 30 #define GPIO_LED2 22 #define GPIO_LED3 28复制代码 因此如果使用OURS-SDK-WFB套件建议使用套件的common文件夹 (二)路径问题 由于换了个工作环境,结果路径出了些问题,发现了当初路径设计的一些缺陷的地方。 当初的路径都是使用绝对路径的,现在替换为相对路径,前面用宏表示,方便转移工程文件。${WorkspaceDirPath}代替开头那部分,省略了工作空间部分的路径: (三)全局声明 类似keil里面C/C++选项下面的define,ccs或者说eclipse下面也有类似的地方: 右键——properties: 像上图就是在freertos工程定义了USE_FREERTOS的全局宏

  • 2019-01-24
  • 回复了主题帖: 【新人必看】TI M4个人收集所有资料倾情大放送。。。。。。。。。。。。

    哈哈顶一个

  • 发表了主题帖: CC3200套件——OURS-SDK-WFB初上手

    本帖最后由 tinnu 于 2019-1-24 00:37 编辑 OURS-SDK-WFB是上上一年圣诞前后申请的,相隔也有一年时间,可惜当时忙着捣鼓各种事情,最终还是没能参加TI的比赛。 今天开箱准备捣鼓一下,没想到这玩意真的是折腾人啊 (一)开箱 正所谓再丑的板子,只要黑油就高大上。再牛逼的板子,只要是绿油就矮穷挫。 不过板子不仅黑油盖,而且排布也非常漂亮。 (二)资料获取 首先,这个套件的资料光盘我就不多吐槽了,基本没听说过有谁成功地读过这张光盘。 不过里面 资料也很好获取,直接搜索“OURS-SDK-WFB”就可以找到。 不过从光盘这件事情就可以以小窥大,这套件,它的内在……绝对不像它外表看起来那么漂亮。 18M的压缩包,看到这个大小我就隐约有点感觉了,一打开,三个文件: 解压了code,在里面找来找去也没有什么说明书之类的,看来唯一的说明就是根目录下面的那个pdf了 那个PDF有兴趣自己去找,然后用心感受……基本上……也是没什么大用的东西: 以上这页纸就是关于GPIO操作的所有内容,可以看到,这个pdf就类似个操作说明一类的东西,不能指望它是x点原子xtm32库函数开发指南。 code里面的例程,也是众多芯片公司官方例程的一贯尿性,全部搅在一起,根本没办法知道这个工程要搭配哪些文件,分离一个例程出来工作量相当不小。 (三)开发环境搭建 TI,大名鼎鼎的德州仪器,全世界最牛逼的芯片公司,做事当然不能跟那些妖艳的xx苟同,否则怎么凸显自己的高大上?因此它家的编译器也要标新立异: CCS(CCSTUDIO Code Composer Studio):TI家御用IDE 当然,此外用IAR、GCC也会可以的,但唯有KEIL不行。君不见,Keil Software的面子谁敢不给,德州仪器就敢! 不过啊,人家牛逼是一个原因,其实还有一个很重要的原因:你看啊,keil不是要收费吗? 这时候小明同学就举手了,一脸骄傲地说他用keil没花半分钱。 对于这个问题,大家用心感受下面这张图,我就不多说了: 虽然有大佬用虚拟机测过30年也依然是可以用的,但天知道Keil Software有什么手段,微软都说了,你KXS的系统它是知道得一清二楚的,到时候来一招釜底抽薪,该补交的学费还是得乖乖上缴。 这么一看,CCS就牛逼了,人家免费! 然后我兴高采烈地去官网填了一大堆资料,终于把这个15M的软件下了下来: 运行: 这…… 找了半天,总管是把一个804M的压缩包下了下来,这下就不用下载什么JRE,直接安装完成 (四)搭建工程 CCS是基于eclipse的,但电子工程师,有几个会捣鼓eclipse,基本都被keil毒害得差不多,就跟那种离开vs就不会编程的小白差不多,顶多就捣鼓捣鼓QT顶天了。幸好在下有些linux功底,摸索了半天终于是把这个工程给捣鼓了出来。 1、首先在工作空间目录创建一个drive文件夹,从code里面搬几个文件过去: common driverlib inc 2、创建工程,把例程3.1 blinky下面的.c和.h文件搬到工程目录下 3、工程处邮件——properties 在Include Options下面加入头文件位置: 在File Search Path下面加入common下面的静态库: 4、把主板下面的拨码盘第三位拨到1 5、连接主板与PC 6、点击工具链上面的绿色小虫子进行debug 7、这时候会弹出仿真器相关配置: 按照上图选好后点击保存 8、enjoy it (五)其余资料的链接 这个套件里面的资料可以用贫乏来形容了,所幸社区还捣鼓了一番launchpad,是另一款CC3200的板子,资料可以借鉴,里面有函数API手册和芯片手册: 丰富的资料 少量的资料 这块板子的资料

  • 2019-01-18
  • 回复了主题帖: 【GD32F350开发分享三】定时器T0中断:内部高速时钟源

    cliff.xu 发表于 2019-1-16 10:47 我按你的设置测得输出为200Ms。 同样的定时器设置, Timer0测得200ms, Timer2测得100Ms. 留个痕迹 ...
    咳咳,那个问题后来发现是因为没有设置对时钟源,用了没有焊上的外部时钟,结果直接用了内部8M的高速时钟(没有任何倍频)……选对时钟源之后就能按时输出了

  • 2018-11-19
  • 回复了主题帖: 四轴视觉机械臂——基于F350下位机

    特效化妆师 发表于 2018-11-1 16:16 一定不要忽视我啊,我辣么可爱的
    呃……主要是这两个月都要赶着考研复习进度,现在我的复习进度非常尴尬……如果可以的话十二月之后再交流?{:1_133:}

  • 回复了主题帖: 四轴视觉机械臂——基于F350下位机

    bqgup 发表于 2018-10-20 18:05 楼主,不知道你的舵机电路解决没,我这儿有一个调试好的舵机电路图,如果您需要的话,我就发给你看看用不用 ...
    我目前主要的pwm传输距离有些问题,我之前为这个搞了挺久的,别人推荐我用开关电路,但也只能传输40cm左右,多一点就不稳。如果版主有方案那就太好了,不过这两个月正在赶着考研复习,等十二月之后再请教可行:loveliness:

  • 2018-10-19
  • 发表了主题帖: 四轴视觉机械臂——基于F350下位机

    本帖最后由 tinnu 于 2018-10-20 00:23 编辑 (一)软硬件结构 上位机:连接摄像头,进行图像识别、用户交互 下位机:指令解析,信息上报,传感器信息采集,电机脉冲控制,空间位置顺解逆解 机械结构:3轴+1轴+1夹持架。 (二)机械结构部分介绍 底部三轴采用步进电机控制,保证精度; 主要负重的主轴和副轴采用42bygh48,旋转轴采用42bygh34。 (关于这个电机的问题真的坑啊……我设计的机械臂有点太大了,不断加传动比都很容易出现力矩不够的情况,1.0版的机械臂1:3.5的传动比,一直换到42bygh48都不行,42bygh48基本是市面上常见的步进里面力矩最大的……而且这个步进电机也是贼贵,几个几个的买真的吃不消……最后不行,改版弄出了一个2.0般的机械臂,1:5的传动比) 末端旋转轴采用mg996舵机控制; 夹持架采用mg996 (三)硬件结构 一开始是用cnc shield控制板+一块自己焊的接口板(接角度传感器+限位开关): 后来自己画了一块: 黑油板是不是很酷?其实因为我犯了个很难受的错误,导致一些地线没接上,所以其实这个板子背后有好几根飞线来着…… 舵机供电也是个巨坑,我设计了两个供电方案保证成功: LM7805从12V转到5V: 还有一个就是直接usb供 (四)下位机功能1、传感器信息采集步进电机这种东西虽然常用于开环控制,但奈何那都是力矩经过验算的情况,我这个容易遇到力矩大的角度的机械臂不知道什么时候就失步了,所以用两个mpu6050反馈主轴和副轴的角度信息。不过这个反馈并非数控传统意义上的闭环控制,只是运动结束之后同步一下。此外,如果传感器损坏或者接触不良等恶劣情况下系统也会转为开环控制。程序设计中也为adxl345提供了接口,不过因为时间关系还没来得及实现,不过相比于mpu6050,前者还是比较实惠的,虽然mpu6050可以姿态融合,但奈何对采集速度要求严格,间隔一大就读不出来,结果还是直接读角度算了。2、信息上报:下位机接口有两个,USART2的串口和基于USART1的esp8266无线模块,可以通过SERIAL交互、tcp socket交互上报设计了专门的上报体系,不会影响电机控制算法。3、电机脉冲控制:保证电机脉冲控制的优先度最高,采用定时器生成时基、控制时基单元数量控制电机运动速度的方式。4、指令解析:为了保证指令的识别度我没用标准的NC指令,自己设计了一套:指令以_&为开始,以;结束,包含直接传入xy坐标、前后左右、旋转、夹持、翻转、复位、查询:int command_operate(u8 *USART_RX_BUF,u16 USART_RX_STA) {         double x_dis=x_current,y_dis=y_current;                //保存临时路程变量         u16 speed;                                                                        //保存临时速度参数              char SearchChar[USART_REC_LEN];         char command[3]="0";     double command_num[3]={0};                  u16 len = USART_RX_STA&0x3fff;         u8 CommandCount = 0;                  //1、获取指令、参数         memcpy(SearchChar, USART_RX_BUF, len);         CommandCount = search4(SearchChar, command, command_num);                  if(CommandCount

  • 2018-10-05
  • 回复了主题帖: F350的pwm配置不成功

    到现在依然没有发现问题在哪,但改用TIMER1的CH1通道,通过PA1输出 即 把上面的TIMER15改为TIMER1、CH0改为CH1、PA6改为PA1 又可以正常输出,初步认为是TIMER1定时器有一些TIMER15定时器无法配置的功能,或者TIMER15本身有bug void pwm_pin_config(void) {         rcu_periph_clock_enable(RCU_GPIOA);                 gpio_af_set(GPIOA, GPIO_AF_2,                                 GPIO_PIN_1);     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE,                   GPIO_PIN_1);     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,                             GPIO_PIN_1); } /*!     \ brief配置TIMER外设     \ param [in] none     \ param [out] none     \ retval无 */ void pwm_timer_config(void) {     timer_parameter_struct timer_initpara;         timer_oc_parameter_struct pwm_initpara;                 pwm_pin_config();             rcu_periph_clock_enable(RCU_TIMER1);     timer_deinit(TIMER1);     timer_initpara.prescaler = 1800-1;     timer_initpara.alignedmode = TIMER_COUNTER_EDGE;     timer_initpara.counterdirection = TIMER_COUNTER_UP;     timer_initpara.period = 1200-1;     timer_initpara.clockdivision = TIMER_CKDIV_DIV1;         timer_initpara.repetitioncounter = 0;     timer_init(TIMER1,&timer_initpara);     /* TIMERf1通道控制更新中断启用*/ //    timer_interrupt_enable(TIMER1,TIMER_INT_UP); //        nvic_irq_enable(TIMER1_IRQn,0,1);                 /*         第二步:比较模式配置:         设置CHxCOMSEN位来配置输出比较影子寄存器;         设置CHxCOMCTL位来配置输出模式(置高电平/置低电平/反转);         设置CHxP/CHxNP位来选择有效电平的极性;         设置CHxEN使能输出。         */         pwm_initpara.outputstate = TIMER_CCX_ENABLE;         pwm_initpara.ocpolarity = TIMER_OC_POLARITY_HIGH;         //pwm_initpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;                 timer_channel_output_config(TIMER1, TIMER_CH_1, &pwm_initpara);         timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM1);         timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_ENABLE);         /*         第四步:通过TIMERx_CAR寄存器和TIMERx_CHxCV寄存器配置输出比较时基:         CHxVAL可以在运行时根据你所期望的波形而改变         */         timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 1000);             /* TIMER1计数器启用*/     timer_enable(TIMER1); }复制代码

最近访客

< 1/2 >

统计信息

已有24人来访过

  • 芯币:96
  • 好友:1
  • 主题:10
  • 回复:15
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言