STM32再复习(五)7.24下午

文章目录

      • 定时器(完)
      • PWM 输出

定时器(完)

通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)。
Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk。PSC就是分频系数,ARR就是计数值(自动重装载值),PSC+1为分频系数,因为不为1,所以通用定时器频率为APB1*2=84M,达到这个计数就会发生溢出中断,Tclk就是我上述分析的时钟源频率的倒数。而时钟频率为通用定时器时钟频率,为84M.溢出时间为一次中断事件內计数定时器计数的次数乘频率。

PWM 输出

STM32再复习(五)7.24下午_第1张图片

我们假定定时器工作在向上计数 PWM模式,且当 CNT=CCRx 时输出 1。那么就可以得到如上的 PWM示意图:当 CNT 值小于 CCRx 的时候,IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的频率,这就是 PWM 输出的原理。

STM32F4 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出
CCRx是输入比较寄存器,存放了特定的值。ARR是自动重装载值,即向上计数最大的值。因此可以产生一个PWM方波.占空比说的形成的方波高电平在整个周期的比例。
STM32再复习(五)7.24下午_第2张图片

总之ARR确定了PWM的频率,CCRx确定了占空比。
设置比较值函数:void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Comparex);//这块主要比较的是CCRx的值
使能输出比较预装载:void TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);//比较多ARR的值
使能自动重装载的预装载寄存器允许位:void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);//比较是CCRx在哪个周期起到作用
计数5000次为500ms计数一次,
0.1ms=100us 1Mhz=10^6hz

PWM输出配置步骤:使能定时器14和相关IO口时钟。
1.使能定时器14时钟:RCC_APB1PeriphClockCmd();
2.使能GPIOF时钟:RCC_AHB1PeriphClockCmd ();
3.初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能(把IO口当作定时器所以有下一步)
4. GPIOF9复用映射到定时器14
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
5. 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
6初始化输出比较参数:TIM_OC1Init();
7.使能预装载寄存器: TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
8.使能自动重装载的预装载寄存器允许位TIM_ARRPreloadConfig(TIM14,ENABLE);
9.使能定时器。
10.不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();

我自己认为的PWM,其实就是一个不断比较的过程,与ARR不断比较,得出相应的PWM占空比,产生相关的相应。在pwm.c中,主要是根据上述的配置对PWM进行相关的配置,而进行响应是对主函数.c写PWM的运行模式。我以库函数PWM为例说一下:
u16 led0pwmval=0;
u8 dir=1;
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;//
else led0pwmval–; //
if(led0pwmval>300)dir=0;//
if(led0pwmval==0)dir=1; //

TIM_SetCompare1(TIM14,led0pwmval);
}
led0pwmval++有点类似与CCRx,是对占空比的一个比较,使其在0-300之间不断的变化,也就调节了PWM,很巧妙。

你可能感兴趣的:(STM32再复习(五)7.24下午)