PWM介绍
PWM,即脉冲宽度调制,是英文“Pulse Width ModulaTIon”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
占空比是在连续的脉冲信号频率或周期不变的前提下定义的,用来衡量开关管导通或截止状况,在这个前提下定义占空比为周期电信号中有电信号输出的时间与整个信号周期之比:
D(占空比)=τ(电信号不为“0”的时间)/T(电信号为“0”的时间+电信号不为“0”的时间)*100%
例如:脉冲宽度1μs,信号周期4μs的脉冲序列占空比为0.25。
文章目录
一、STM32 gpio模拟pwm
接下来介绍一路软件驱动的PWM发生器,它作为程序后台的一个线程运行,以PWM方式管理GPIO管脚的输出。可用于控制CPU上的任意数量的引脚作为PWM输出,不足之处是精度上受限于软件调度肯定是无法与硬件PWM模块相媲美的,但是对于驱动LED和普通电机,它没问题,“PWM的周期(频率)就是ARR寄存器值与PSC寄存器值相乘得来,但不是简单意义上的相乘,例子中利用单STM32普通定时器TIM3产生10us定时中断,PA15用作模拟 pwm 输出口:
二、配置步骤
1.GPIO配置
打开GPIO时钟,使能推挽输出模式:
void pwm_GpioInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
//PA15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
2.定时器TIM3配置
接下来我们以通用定时器TIM3为实例,来说明要经过哪些步骤,才能达到这个要求,并产生中断。
1)TIM3时钟使能。
这里我们通过APB1ENR的第1位来设置TIM3的时钟,因为Stm32_Clock_Init函数里面把APB1的分频设置为2了,所以我们的TIM3时钟就是APB1时钟的2被,等于系统时钟。
2)设置TIM3_ARR和TIM3_PSC的值。
通过这两个寄存器,我们来设置自动重装的值,以及分频系数。这两个参数加上时钟频率就决定了定时器的溢出时间。
3)设置TIM3_DIER允许更新中断。
因为我们要使用TIM3的更新中断,所以设置DIER的UIE位,并使能触发中断。
4)允许TIM3工作。
光配置好定时器还不行,没有开启定时器,照样不能用。我们在配置完后要开启定时器,通过TIM3_CR1的CEN位来设置。
5)TIM3中断分组设置。
在定时器配置完了之后,因为要产生中断,必不可少的要设置NVIC相关寄存器,以使能TIM3中断。
6)编写中断服务函数。
在最后,还是要编写定时器中断服务函数,通过该函数来处理定时器产生的相关中断。在中断产生后,通过状态寄存器的值来判断此次产生的中断属于什么类型。然后执行相关的操作,我们这里使用的是更新(溢出)中断,所以在状态寄存器SR的最低位。在处理完中断之后应该向TIM3_SR的最低位写0,来清除该中断标志。
通过以上几个步骤,我们就可以达到我们的目的了,使用通用定时器的的更新中断,来控制pwm周期性产生。
void TIM3_Init(</