标题: STM32魔术手+语音模块控制源码 [打印本页]

作者: 彬Lsl    时间: 2018-7-1 10:15
标题: STM32魔术手+语音模块控制源码
根据前面的程序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)



作者: wenzedong    时间: 2018-7-1 17:37
通过上面的程序我没看见任何和语音模块相关的代码,而且也没看到用红外干嘛,就看到一个用超声波(TiM5捕获时间)从而算出距离,你说UART是来和语音芯片进行通信的,但程序里一点都不需要体现吗,后来才发现你是粘贴的上一次的代码,那红外和UART也没见你用到哇
作者: wenzedong    时间: 2018-7-1 17:47
你发的代码我看了,我的疑惑仍然存在,你能发个你实验的图,并说明一下你的红外管和语音模块分别起得作用吗
作者: 彬Lsl    时间: 2018-7-2 12:03
wenzedong 发表于 2018-7-1 17:37
通过上面的程序我没看见任何和语音模块相关的代码,而且也没看到用红外干嘛,就看到一个用超声波(TiM5捕获 ...

没说到有用红外呀,语音模块是买集成好的 采用的是串口通信,具体的实现可以看usart.c文件
作者: 彬Lsl    时间: 2018-7-2 12:04
wenzedong 发表于 2018-7-1 17:47
你发的代码我看了,我的疑惑仍然存在,你能发个你实验的图,并说明一下你的红外管和语音模块分别起得作用吗

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

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1