这几天一直在做蓝桥杯嵌入式开发历年的题目 在第七届决赛的模拟题中 有一个要求PA6和PA7产生两个异相并且频率可调的方波 后来我研究了一下STM32的Output comare mode,
因为要调节频率 所以选择了toggle 模式 使方波产生异相在中断中设置就行 先上手册的图
那 这是张老图了
在来看一下 官方StdLib3.5的OCToggle模式下的中断函数
void TIM1_BRK_TIM9_IRQHandler(void)
{
/* TIM9_CH1 toggling with frequency = 366.2 Hz */
if (TIM_GetITStatus(TIM9, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM9, TIM_IT_CC1 );
capture = TIM_GetCapture1(TIM9);
TIM_SetCompare1(TIM9, capture + CCR1Val );
}
/* TIM9_CH2 toggling with frequency = 732.4 Hz */
if (TIM_GetITStatus(TIM9, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM9, TIM_IT_CC2);
capture = TIM_GetCapture2(TIM9);
TIM_SetCompare2(TIM9, capture + CCR2Val);
}
}
OCToggle的运行方式基本是这样的:
如果TIMx_CNT=TIM_CCR1 那么就发生上面的中断 在中断里 他会将CCR1的值加上你自己设定的CCR1Val值 再赋值到CCR1 上 每发生一次中断 就会将电平翻转(toggle)
因为两者的频率一样 所以发生两个通道中断也应该是紧挨着的
所以为了保持俩通道的相位差 在通道1发生中断时 再根据你的CCR2Val值的加上相应的值赋给CCR2 就相当于在通道1中端时 把通道2的时刻往后延时了一会儿
像下面这样
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC1 );
capture = TIM_GetCapture1(TIM3);
TIM_SetCompare1(TIM3, capture + CCR1Val );
TIM_SetCompare2(TIM3, capture +200);
}
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
capture = TIM_GetCapture2(TIM3);
TIM_SetCompare2(TIM3, capture + CCR2Val);
}
}
我CCR1Val和CCR2Val都设定的1000 加上200后CH2就产生了相移
原理是这样 在初始化时可以赋予不同的初值 就不需要开中断进行toggle了
上一篇:STM32串口空闲中断问题
下一篇:有关STM32F103C8T6使用ST_Link的注意事项
推荐阅读最新更新时间:2024-03-16 16:22