发 帖  
原厂入驻New
[讨论] STM32单片机如何采集高精度的占空比
2019-12-28 15:36:47  499 STM32
分享
我的采集的频率是145HZ但是我现在使用的是输入捕获的功能,但是采集出来的效果感觉很一般,按理来说这个频率的占空比使用硬件的输入捕获功能是效果最好的,因为要采集三个通道的,同时要保证高精度的,大家有没有什么好的方案推荐一下,谢谢。同时附上我的 源代码
0

3通道输入捕获1.zip

下载积分: 积分 -1 分

3.85 MB, 下载次数: 3, 下载积分: 积分 -1 分

2019-12-28 15:36:47   评论 分享淘帖
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "timer.h"
  5. #include "usart.h"



  6. extern u8  TIM2CH2_CAPTURE_STA;                //输入捕获状态                                                   
  7. extern u16        TIM2CH2_CAPTURE_VAL;        //输入捕获值

  8. extern u8  TIM2CH3_CAPTURE_STA;                //输入捕获状态                                                   
  9. extern u16        TIM2CH3_CAPTURE_VAL;        //输入捕获值

  10. extern u8  TIM2CH4_CAPTURE_STA;                //输入捕获状态                                                   
  11. extern u16        TIM2CH4_CAPTURE_VAL;        //输入捕获值



  12. int main(void)
  13. {       
  14.         u16 temp1=0,temp2=0,temp3=0,temp4=0;
  15.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
  16.         delay_init();                            //延时函数初始化       
  17.         uart_init(9600);                                 //9600         
  18.         LED_Init();                                      //初始化与LED连接的硬件接口
  19.         TIM2_Cap_Init(0XFFFF,72-1);            //以1Mhz的频率计数
  20.            while(1)
  21.         {
  22.                          

  23.          if(TIM2CH2_CAPTURE_STA&0X80)//成功捕获到了一次高电平
  24.                 {
  25.                         temp1=TIM2CH2_CAPTURE_STA&0X3F;
  26.             temp1*=65536;        //65536
  27.                         temp1+=TIM2CH2_CAPTURE_VAL;                //得到总的高电平时间
  28. //                        printf("H2:%d\r\n",temp1);        //打印总的高点平时间
  29.                         TIM2CH2_CAPTURE_STA=0;                        //开启下一次捕获
  30.                 }
  31.            if(TIM2CH3_CAPTURE_STA&0X80)//成功捕获到了一次高电平
  32.                 {
  33.                         temp2=TIM2CH3_CAPTURE_STA&0X3F;
  34.             temp2*=65536;        //65536
  35.                         temp2+=TIM2CH3_CAPTURE_VAL;                //得到总的高电平时间
  36. //                        printf("H3:%d\r\n",temp2);        //打印总的高点平时间
  37.                         TIM2CH3_CAPTURE_STA=0;                        //开启下一次捕获
  38.                 }
  39.             if(TIM2CH4_CAPTURE_STA&0X80)//成功捕获到了一次高电平
  40.                 {
  41.                         temp3=TIM2CH4_CAPTURE_STA&0X3F;
  42.             temp3*=65536;        //65536
  43.                         temp3+=TIM2CH4_CAPTURE_VAL;                //得到总的高电平时间
  44. //                        printf("H4:%d\r\n",temp3);        //打印总的高点平时间
  45.                         TIM2CH4_CAPTURE_STA=0;                        //开启下一次捕获
  46.                 }
  47.         
  48.       
  49.         
  50.         
  51.         
  52.         
  53.         }
  54. }
复制代码
为什么这个只有使用printf之后,temp123的值才输出比较准确,如果不使用printf,捕获的高电平的时间直接是乱跳的,不太清楚这个问题,
2019-12-28 15:40:18

举报

撰写讨论

你正在撰写讨论

如果你是对讨论或其他讨论精选点评或询问,请使用“评论”功能。

高级模式
您需要登录后才可以回帖 登录 | 注册

发讨论
关闭

站长推荐 上一条 /6 下一条

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