找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4308|回复: 6
收起左侧

STM32魔术手+语音模块控制源码

[复制链接]
ID:183120 发表于 2018-7-1 10:15 | 显示全部楼层 |阅读模式
根据前面的程序http://www.51hei.com/bbs/dpj-126046-1.html 继续拓展出了加上用语音模块控制电机,主程序是执行超声波程序,当电机处于停止状态时,语音控制电机才起作用(这个问题我也不清楚为啥,看到此贴的大神可以交流交流),语音模块是用串口通讯的

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "interface.h"
  3. #include "motor.h"
  4. #include "sys.h"
  5. #include "delay.h"
  6. #include "LED.h"
  7. #include "UltrasonicWave.h"
  8. #include "usart.h"


  9. void BarrierProc(float distance_cm);

  10. extern u8  TIM5CH1_CAPTURE_STA;                //输入捕获状态                                                   
  11. extern u16        TIM5CH1_CAPTURE_VAL;        //输入捕获值        


  12. int main(void)
  13. {
  14.         u32 temp=0;

  15.         float UltrasonicWave_Distance=0;      //计算出的距离
  16.         
  17.         
  18.         delay_init();
  19.         GPIOCLKInit();
  20.         RedRayInit();
  21.         MotorInit();//必须放在TIM3_PWM_Init函数上面,因为TIM3_PWM_Init函数需要复用端口
  22.         TIM3_PWM_Init();
  23.         
  24.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  25.         USART3_Initialise(9600);         //串口初始化为9600
  26.         uart_init(115200);                        //串口初始化为115200
  27.          LED_Init();                             //LED端口初始化
  28.         UltrasonicWave_Configuration();               //对超声波模块初始化
  29.         TIM5_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数
  30.         
  31.         
  32.         while(1)
  33.         {         

  34.                 UltrasonicWave_StartMeasure();//开始测距
  35.                         

  36.                 temp=TIM5CH1_CAPTURE_STA&0X3F;
  37.                 temp*=65536;//溢出时间总和
  38.                 temp+=TIM5CH1_CAPTURE_VAL;//得到总的高电平时间
  39.                
  40.                 //距离计算公式:距离=高电平持续时间*声速/2   
  41.                 //即 距离= 高电平持续时间*340*100/(2*1000 000) = 高电平持续时间*170/10000
  42.                 UltrasonicWave_Distance=(float)temp*170/10000;
  43.                
  44.                 printf("Distance:%f cm\r\n",UltrasonicWave_Distance);//打印总的高点平时间
  45.                
  46.         
  47.         
  48.                 BarrierProc(UltrasonicWave_Distance);
  49.                
  50.                 TIM5CH1_CAPTURE_STA=0;//开启下一次捕获


  51.         }

  52. }


  53. void BarrierProc(float distance_cm)
  54. {
  55.         if(distance_cm <= 15 && distance_cm >= 2 )
  56.         {
  57.                 CarBack();
  58.         }
  59.         else if(distance_cm >= 20 && distance_cm <= 50)
  60.         {        
  61.                 CarGo();
  62.         }
  63.         else
  64.                 CarStop();//防震荡
  65. }
复制代码

所有资料51hei提供下载:
超声波魔术手+语音模块.rar (289.41 KB, 下载次数: 32)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:319344 发表于 2018-7-1 17:37 | 显示全部楼层
通过上面的程序我没看见任何和语音模块相关的代码,而且也没看到用红外干嘛,就看到一个用超声波(TiM5捕获时间)从而算出距离,你说UART是来和语音芯片进行通信的,但程序里一点都不需要体现吗,后来才发现你是粘贴的上一次的代码,那红外和UART也没见你用到哇
回复

使用道具 举报

ID:319344 发表于 2018-7-1 17:47 | 显示全部楼层
你发的代码我看了,我的疑惑仍然存在,你能发个你实验的图,并说明一下你的红外管和语音模块分别起得作用吗
回复

使用道具 举报

ID:183120 发表于 2018-7-2 12:03 | 显示全部楼层
wenzedong 发表于 2018-7-1 17:37
通过上面的程序我没看见任何和语音模块相关的代码,而且也没看到用红外干嘛,就看到一个用超声波(TiM5捕获 ...

没说到有用红外呀,语音模块是买集成好的 采用的是串口通信,具体的实现可以看usart.c文件
回复

使用道具 举报

ID:183120 发表于 2018-7-2 12:04 | 显示全部楼层
wenzedong 发表于 2018-7-1 17:47
你发的代码我看了,我的疑惑仍然存在,你能发个你实验的图,并说明一下你的红外管和语音模块分别起得作用吗

没有画图,具体的连线的可以参考程序
回复

使用道具 举报

ID:319344 发表于 2018-7-2 17:32 | 显示全部楼层
RedRayInit(); 使我认为你用到了红外,但之后就没有相关的代码了,我疏忽的一点是你都说了用到串口,我竟然没有看一眼串口中断服务函数,是在失误。根据我对你写的代码进行分析,用到了两个中断,首先是测距中用到的TIM5捕获,抢占优先级设置为2,通过语音对1~5做出反应的UART中断抢占优先级设置为了1,我认为即使此时电机正在工作,但当你说话后也会对UART中断服务函数进行处理。你可以用点亮灯之类的观察现象,毕竟都是控制电机,现象不好观察
回复

使用道具 举报

ID:183120 发表于 2018-7-4 09:46 | 显示全部楼层
wenzedong 发表于 2018-7-2 17:32
RedRayInit(); 使我认为你用到了红外,但之后就没有相关的代码了,我疏忽的一点是你都说了用到串口,我竟然 ...

哈哈
试了好多次都是一样,电机停了,语音模块才能接收到
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表