STM32输入捕获问题

2019-07-24 13:42发布

波形.png

这是要捕捉的波形图  
图中圈出来的是数据起始帧,大概370~390us,后面的数据都是小于这个电平宽。

现在的情况是:用STM32F103RBT6   72MHZ主频  1MHZ捕捉  
数据是这样的:391 280 145 390 265 166 150 149 145 165 149 145 165 150 280 281 149 145 279 165 145 266 166 150 148 145 166 149 145 166 151 281 280  149 145 280 167 144 280 148 267 266 148 166 248 143 166
167
144
166
166
391
281
146
390
266
167
150
148
可以看到有两个390连在一起,捕捉是对的  

但是用  STM32L152RCT6   16MHZ主频   1MHZ捕捉  数据是这样的 272 261 385 141 141 260 158 272 137 158 158 271 137 272 272 260 385 140 140 260 157 272 138 158  157 272 138 272 271 261 384
141
137
260
157
272
138
158
157
272
139
271
272
261
384
141
140
259
152
271
137
158
157
272
138
272
272
261
386
141
141
260
157
272
139
158
156
272
137
271
272

两个380之间隔了很多数据  数据就不对了


void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕捉中断  这是STM32L152RC的捕捉部分代码 TIM2CH1_CAPTURE_VAL:高电平时间 LOW_temp:低电平时间
{
       
   if(TIM2==htim->Instance)
         {

          if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获       
                {          
                                if(TIM2CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                
                                {         
                                         TIM2CH1_CAPTURE_STA |= 0X80;                //标记成功捕获到一次高电平
                                        // TIM2CH1_CAPTURE_VAL=__HAL_TIM_GET_COMPARE(&htim2,TIM_CHANNEL_1);
                                                TIM2CH1_CAPTURE_VAL=TIM2->CCR1;       
                                                printf("%d ",TIM2CH1_CAPTURE_VAL);
                                          TIM2->CNT =0;
                                          TIM2->CCR1=0;
                                         //__HAL_TIM_SET_COUNTER(&htim2,0);
                                         //__HAL_TIM_GET_COMPARE(&htim2,0);//CNT和CCR寄存器都需要清0
                                         __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_RISING); //CC1P=0 设置为上升沿捕获
                                }
                                               
                                else  //还未开始,第一次捕获上升沿
                                {
                                                        TIM2CH1_CAPTURE_STA=0;                        //清空
                                                        LOW_temp=__HAL_TIM_GET_COMPARE(&htim2,TIM_CHANNEL_1);
                                       
                                                        //        printf("low:%d ",LOW_temp);
                                                        TIM2CH1_CAPTURE_VAL=0;
                                                        TIM2CH1_CAPTURE_STA|=0X20;                //标记捕获到了上升沿
                                                        TIM2CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿 (调整找高电平用)
                                            TIM2->CNT =0;
                                            TIM2->CCR1=0;
                                                //        __HAL_TIM_SET_COUNTER(&htim2,0);//清空计数值
                                                //        __HAL_TIM_GET_COMPARE(&htim2,0);//CNT和CCR寄存器都需要清0
                                                        __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_INPUTCHANNELPOLARITY_FALLING);        //CC1P=1 设置为下降沿捕获
                          }       
                               
                        }                                                                                   
       
                }
             
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
正点原子
1楼-- · 2019-07-24 17:07
Alle 发表于 2017-12-26 09:36
波特滤115200  已经很高了  就是这么个波形  我用103系列 72MHZ主频单片机都没问题  
就是用16MHZ主频单 ...

主频低,表示执行代码的速度就低,表示中断处理的时间需要的就长,多方面综合考虑吧
正点原子
2楼-- · 2019-07-24 17:52
printf波特率改高一点试试
Alle
3楼-- · 2019-07-24 19:05
正点原子 发表于 2017-12-26 00:50
printf波特率改高一点试试

波特滤115200  已经很高了  就是这么个波形  我用103系列 72MHZ主频单片机都没问题  
就是用16MHZ主频单片机不行  但是定时器都是1MHZ捕捉的。。。
除此之外,还有一个问题 就是我用这个单片机最高只能捕捉8KHZ以下的频率,高了就捕捉不到

一周热门 更多>