你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32CubeMX的8通道输入捕获超声波雷达测距经验

[复制链接]
qq269843844 发布时间:2019-6-10 15:41
本帖最后由 qq269843844 于 2019-6-10 15:41 编辑

下面贴出主要代码和设置
收藏 1 评论4 发布时间:2019-6-10 15:41

举报

4个回答
qq269843844 回答时间:2019-6-10 15:41:54
本帖最后由 qq269843844 于 2019-6-10 11:57 编辑

W~}Z_OGK{~@C1}UJJ@PX(U9.png W(_X6%Q3V3_6}2~%R[0}T.png
qq269843844 回答时间:2019-6-10 15:41:55
本帖最后由 qq269843844 于 2019-6-10 12:00 编辑
  1. uint8_t          Channel1Edge = 0, Channel2Edge = 0, Channel3Edge = 0, Channel4Edge = 0,
  2.                                         Channel5Edge = 0, Channel6Edge = 0, Channel7Edge = 0, Channel8Edge = 0;
  3. uint16_t         Channel1HighTime, Channel1RisingTime, Channel1FallingTime;
  4. uint16_t         Channel2HighTime, Channel2RisingTime, Channel2FallingTime;
  5. uint16_t         Channel3HighTime, Channel3RisingTime, Channel3FallingTime;
  6. uint16_t         Channel4HighTime, Channel4RisingTime, Channel4FallingTime;
  7. uint16_t         Channel5HighTime, Channel5RisingTime, Channel5FallingTime;
  8. uint16_t         Channel6HighTime, Channel6RisingTime, Channel6FallingTime;
  9. uint16_t         Channel7HighTime, Channel7RisingTime, Channel7FallingTime;
  10. uint16_t         Channel8HighTime, Channel8RisingTime, Channel8FallingTime;
复制代码
  1. HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);        //开启捕获通道
  2.         HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
  3.         HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3);
  4.         HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_4);

  5.         HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1);
  6.         HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_2);
  7.         HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_3);
  8.         HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_4);                               
复制代码

qq269843844 回答时间:2019-6-10 15:41:56
  1. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
  2. {
  3.   /*防止未使用参数(s)编译警告*/
  4.   UNUSED(htim);

  5.         if(htim->Instance == htim2.Instance)
  6.         {
  7.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  8.                 {
  9.                         if(Channel1Edge == 0)                                                                                                                                                                                                                                                                                        //捕获上升沿
  10.                         {
  11.                                 Channel1RisingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);                                                                        //获取上升沿时间点
  12.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);        //切换捕获极性
  13.                                 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);                                                                                                                                                                                        //切换捕获极性后需重新启动
  14.                                
  15.                                 Channel1Edge = 1;                                                                                                                                                                                                                                                                                                //上升沿、下降沿捕获标志位
  16.                         }
  17.                         else if(Channel1Edge == 1)                                                                                                                                                                                                                                                                //捕获下降沿
  18.                         {
  19.                                 Channel1FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1);                                                                        //获取下降沿时间点
  20.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);        //切换捕获极性
  21.                                 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);                                                                                                                                                                                        //切换捕获极性后需重新启动
  22.                                
  23.                                 Channel1HighTime = Channel1FallingTime < Channel1RisingTime ? Channel1FallingTime + 0xffff - Channel1RisingTime + 1 : Channel1FallingTime - Channel1RisingTime;
  24.                                                                                                                                                                                                                                                                                                                                                                                                 //高电平持续时间 = 下降沿时间点 - 上升沿时间点
  25.                                
  26.                                 dis_fm = Channel1HighTime * 17 / 100;                                                                                                                                                                                                                //计算超声波测量距离
  27.                                 printf("dis_fm = %d\r\n", dis_fm);
  28.                                 i++;                                                                                                                                                                                                                                                                                                                                                //累加计数
  29.                                 Channel1Edge = 0;                                                                                                                                                                                                                                                                                                //一次采集完毕,清零
  30.                         }
  31.                 }
  32.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  33.                 {
  34.                         if(Channel2Edge == 0)
  35.                         {
  36.                                 Channel2RisingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);
  37.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);
  38.                                 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
  39.                                
  40.                                 Channel2Edge = 1;
  41.                         }
  42.                         else if(Channel2Edge == 1)
  43.                         {
  44.                                 Channel2FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2);       
  45.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);
  46.                                 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
  47.                                
  48.                                 Channel2HighTime = Channel2FallingTime < Channel2RisingTime ? Channel2FallingTime + 0xffff - Channel2RisingTime + 1 : Channel2FallingTime - Channel2RisingTime;
  49.                                
  50.                                 dis_fr = Channel2HighTime * 17 / 100;
  51.                                 printf("dis_fr = %d\r\n", dis_fr);
  52.                                 i++;
  53.                                 Channel2Edge = 0;
  54.                         }
  55.                 }
  56.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
  57.                 {
  58.                         if(Channel3Edge == 0)
  59.                         {
  60.                                 Channel3RisingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3);
  61.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING);
  62.                                 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3);
  63.                                 Channel3Edge = 1;
  64.                         }
  65.                         else if(Channel3Edge == 1)
  66.                         {
  67.                                 Channel3FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_3);       
  68.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING);
  69.                                 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_3);
  70.                                
  71.                                 Channel3HighTime = Channel3FallingTime < Channel3RisingTime ? Channel3FallingTime + 0xffff - Channel3RisingTime + 1 : Channel3FallingTime - Channel3RisingTime;
  72.                        
  73.                                 dis_br = Channel3HighTime * 17 / 100;
  74.                                 printf("dis_br = %d\r\n", dis_br);
  75.                                 i++;                               
  76.                                 Channel3Edge = 0;
  77.                         }
  78.                 }
  79.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
  80.                 {
  81.                         if(Channel4Edge == 0)
  82.                         {
  83.                                 Channel4RisingTime= HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_4);
  84.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_4, TIM_INPUTCHANNELPOLARITY_FALLING);
  85.                                 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_4);
  86.                                 Channel4Edge = 1;
  87.                         }
  88.                         else if(Channel4Edge == 1)
  89.                         {
  90.                                 Channel4FallingTime = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_4);       
  91.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_4, TIM_INPUTCHANNELPOLARITY_RISING);
  92.                                 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_4);
  93.                                
  94.                                 Channel4HighTime = Channel4FallingTime < Channel4RisingTime ? Channel4FallingTime + 0xffff - Channel4RisingTime + 1 : Channel4FallingTime - Channel4RisingTime;
  95.                                
  96.                                 dis_ri = Channel4HighTime * 17 / 100;
  97.                                 printf("dis_ri = %d\r\n", dis_ri);
  98.                                 i++;                               
  99.                                 Channel4Edge = 0;
  100.                         }
  101.                 }
  102.         }
  103.        
  104.         if(htim->Instance == htim4.Instance)
  105.         {
  106.                 if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  107.                 {
  108.                         if(Channel5Edge == 0)
  109.                         {
  110.                                 Channel5RisingTime = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_1);//获取上升沿时间点
  111.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);//切换捕获极性
  112.                                 HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1);
  113.                                
  114.                                 Channel5Edge = 1;
  115.                         }
  116.                         else if(Channel5Edge == 1)
  117.                         {
  118.                                 Channel5FallingTime = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_1);       
  119.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
  120.                                 HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_1);
  121.                                
  122.                                 Channel5HighTime = Channel5FallingTime < Channel5RisingTime ? Channel5FallingTime + 0xffff - Channel5RisingTime + 1 : Channel5FallingTime - Channel5RisingTime;
  123.                                
  124.                                 dis_fl = Channel5HighTime * 17 / 100;
  125.                                 printf("dis_fl = %d\r\n", dis_fl);
  126.                                 i++;                               
  127.                                 Channel5Edge = 0;
  128.                         }
  129.                 }
  130.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  131.                 {
  132.                         if(Channel6Edge == 0)
  133.                         {
  134.                                 Channel6RisingTime = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_2);
  135.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);
  136.                                 HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_2);

  137.                                 Channel6Edge = 1;
  138.                         }
  139.                         else if(Channel6Edge == 1)
  140.                         {
  141.                                 Channel6FallingTime = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_2);       
  142.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);
  143.                                 HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_2);

  144.                                 Channel6HighTime = Channel6FallingTime < Channel6RisingTime ? Channel6FallingTime + 0xffff - Channel6RisingTime + 1 : Channel6FallingTime - Channel6RisingTime;

  145.                                 dis_bl = Channel6HighTime * 17 / 100;
  146.                                 printf("dis_bl = %d\r\n", dis_bl);
  147.                                 i++;
  148.                                 Channel6Edge = 0;
  149.                         }
  150.                 }
  151.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
  152.                 {
  153.                         if(Channel7Edge == 0)
  154.                         {
  155.                                 Channel7RisingTime = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_3);
  156.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING);
  157.                                 HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_3);
  158.                                 Channel7Edge = 1;
  159.                         }
  160.                         else if(Channel7Edge == 1)
  161.                         {
  162.                                 Channel7FallingTime = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_3);       
  163.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_RISING);
  164.                                 HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_3);

  165.                                 Channel7HighTime = Channel7FallingTime < Channel7RisingTime ? Channel7FallingTime + 0xffff - Channel7RisingTime + 1 : Channel7FallingTime - Channel7RisingTime;

  166.                                 dis_le = Channel7HighTime * 17 / 100;
  167.                                 printf("dis_le = %d\r\n", dis_le);
  168.                                 i++;                               
  169.                                 Channel7Edge = 0;
  170.                         }
  171.                 }
  172.                 else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
  173.                 {
  174.                         if(Channel8Edge == 0)
  175.                         {
  176.                                 Channel8RisingTime= HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4);
  177.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_4, TIM_INPUTCHANNELPOLARITY_FALLING);
  178.                                 HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_4);
  179.                                 Channel8Edge = 1;
  180.                         }
  181.                         else if(Channel8Edge == 1)
  182.                         {
  183.                                 Channel8FallingTime = HAL_TIM_ReadCapturedValue(&htim4, TIM_CHANNEL_4);       
  184.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim4, TIM_CHANNEL_4, TIM_INPUTCHANNELPOLARITY_RISING);
  185.                                 HAL_TIM_IC_Start_IT(&htim4, TIM_CHANNEL_4);

  186.                                 Channel8HighTime = Channel8FallingTime < Channel8RisingTime ? Channel8FallingTime + 0xffff - Channel8RisingTime + 1 : Channel8FallingTime - Channel8RisingTime;

  187.                                 dis_bm = Channel8HighTime * 17 / 100;
  188.                                 printf("dis_bm = %d\r\n", dis_bm);
  189.                                 i++;
  190.                                 Channel8Edge = 0;
  191.                         }
  192.                 }
  193.         }
  194. }
复制代码




五哥1 回答时间:2019-6-10 15:52:20
谢谢分享,经过鉴定,楼主好人一枚。

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版