这是要捕捉的波形图
图中圈出来的是数据起始帧,大概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 设置为下降沿捕获
}
}
}
}
主频低,表示执行代码的速度就低,表示中断处理的时间需要的就长,多方面综合考虑吧
波特滤115200 已经很高了 就是这么个波形 我用103系列 72MHZ主频单片机都没问题
就是用16MHZ主频单片机不行 但是定时器都是1MHZ捕捉的。。。
除此之外,还有一个问题 就是我用这个单片机最高只能捕捉8KHZ以下的频率,高了就捕捉不到
一周热门 更多>