历史上的今天
今天是:2025年01月07日(星期二)
2019年01月07日 | STM32产生异相方波
2019-01-07 来源:eefocus
这几天一直在做蓝桥杯嵌入式开发历年的题目 在第七届决赛的模拟题中 有一个要求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了
史海拾趣
|
很久没上论坛了啊,最近一段时间太忙,今天上了下,发现人气还是很火,真的不错,现在很多的论坛,qq群虽然都很多人,但是讨论的太少,交流也有限。(不知道是不是人人都不爱说话的原因) 我支持我们这个论坛,希望能一直这么热闹下去,和大家一起 ...… 查看全部问答> |
|
请问下UCOS+ARM9模式下如何编写串口通信 最近将UCOS移植到了ARM9下,但是编写串口通信时出了问题,主要是目前串口无法接受到PC机上的数据,请问各位朋友有谁碰到过类似的问题?… 查看全部问答> |
|
程序中在计算数值的时候将AD中断关闭,计算完成后再将AD中断打开,但是现在发现在AD采样率低的时候AD转换结果没问题,但是提高了采样率,AD结果就不对了,寄存器显示OVERRUN,貌似是数据丢失或者覆盖,这是咋回事呢? 开关AD中断不该影响AD转换啊? ...… 查看全部问答> |
|
本帖最后由 lyzhangxiang 于 2015-7-2 23:07 编辑 搭建了一下开发环境,已经能够运行contiki了,基本和我预料的一样,分分钟可以跑contiki,就是这么easy。 最简单的hello-world 复杂一点的cc26xx-web-demo 效果 mqtt+coap+sensor ...… 查看全部问答> |




