如何使用STM32指定一个IO输出PWM波
这样写不太好,从代码来看你是用中断模拟一个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%左右