微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 如何使用STM32指定一个IO输出PWM波

如何使用STM32指定一个IO输出PWM波

时间:10-02 整理:3721RD 点击:
我想让PC2输出PWM波,但是PC2不能复用为定时器。请问应该怎么弄?谢谢各位大神赐教!

这样写不太好,从代码来看你是用中断模拟一个PWM波形,PC2引脚好像也没定义硬件PWM,这样只能做较低频率的PWM。
假设你做一个30%占空比的PWM,周期为T,则启动的时候将T3的中断周期设置为0.3T,其间PC2输出高电平,当T3产生中断时,PC2输出低电平,并将T3的中断周期改为0.7T,再次产生中断时,回到开始,就完成循环输出。如果输出的脉冲个数有限制,可以每完成一个周期计数一次,到达脉冲数之后就不再输出。
因此你的中断里面需要做一下几件事情:
1、设置PC2的输出电平
2、修改T3的周期,表示PC2电平持续的时间
3、统计输出的脉冲数(非必需)
4、重新启动T3
伪码:
void T3_IRQHandle(void)
{
     禁止T3;
     if(T3中断标志)
     {
            if(电平标志 == 高)
            {
                  PC2输出低电平
                  修改T3的中断周期,表示低电平持续的时间
                  电平标志 = 低
            }
            else
            {
                 PC2输出高电平
                 修改T3的中断周期,表示高电平持续的时间
                 电平标志 = 高
            }
     }
     清除中断标志
     if(输出脉冲 < 设定脉冲)//可以是其他终止条件,也可以没有终止一直输出
     {
            使能T3
     }
}
这样中断一直发生,输出一直可以持续,但是如果你的频率很高,就要考虑代码执行时间对波形的影响
这样做是不稳定的,就是如果其他中断在执行,输出的占空比精度会受到影响
如果你要做一些控制例如电机加减速,则可以在步骤2加入计算或查表等等
不要在中断里面使用while(1),中断时间过长会影响系统性能,例如这时候其他设备串口发来数据,但是你还在T3里面循环,等退出来的时候可能串口数据已经丢掉了一部分....

用定时器

自己顶一下

应该先看看原理图吧,看看PC2有没有定时器复用,再或者看看那个定时器的映射管脚有没有PC2,不知道对不对

如果定时器功能定义在那个管脚上,配置一下就可以了
如果没有定义,则只能软件模拟PWM

没有啊,有的话配置一下就可以了

请问这样写中断函数吗有问题吗?


抱歉,忘记将TIM4改为TIM3了

这样写中断函数有问题吗?


请问是这样的吗?


对,就是这样,这样大致就是100:50的比率,占空比30%左右

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top