至于什么是PWM,百度即可,其实内容简单。 首先STM32中PWM功能是使用计数器实现的,与51里相似,但也有区别。51使用计数器的中断调节占空比,占用MCU的时间。而STM32使用硬件实现PWM的功能,故PWM属于外设功能。(计数器的向上计数,向下计数,中央对齐模式不介绍了)。
PWM主要对2个寄存器的配置。TIMx_ARR = T (设置周期T,频率的设置)
TIMx_CCRx = t(设置占空比,这个一条库函数就行了)
**附:PWM仍进入挂接的TIMx的中断操作。不过51中断是中断作为一小份进入中断再计数进行pwm调制。而STM32是到ti则进入,已经调制好
#include "PWM.h"
void PWM_init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//挂接时钟RCC上
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/* 定时器的配置*/
TIM_TimeBaseStructure.TIM_Period =900 ; //设置定时器频率
TIM_TimeBaseStructure.TIM_Prescaler = 0; //不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure);
TIM_Cmd(TIM3, ENABLE);
/* PWM配置*/
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //指定管脚的映射,这个配置的pwm映射到TIM3上
/* 配置pwm对led进行亮度的调节,故配置led的GPIO*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽复用功能,pwm控制led,不是MCU就不用GPIO_Mode_Out_PP
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
中断文件里使用的函数
void EXTI2_IRQHandler(void) //这里外部中断作为调制pwm的ti(占空比)使用
{
if(EXTI_GetITStatus(EXTI_Line2)==SET) //判断是否进入外部中断2
{
EXTI_ClearITPendingBit(EXTI_Line2); // 清除线路EXIT的挂起
delay_ms(10); //
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //读取key_up是否按下
{
if(ti<500)
ti=ti+100;
else
ti=0; //按键增加占空比
}
while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); //没错,这里就是松开判断
}
}
void TIM3_IRQHandler(void) //到了ti则进入中断,给led一定占空比的高电平
{
static u8 i=0;
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清空中断源
GPIO_Write(GPIOC,(u16)~(0x01<if(i==8) i=0;
}
main.c 主函数就简单了
#include "public.h"
#include "Systick.h"
#include "PWM.h"
#include "ExInter.h"
int main()
{
PWM_init();
ExInter_init();
while(1)
{
delay_ms(10);
TIM_SetCompare2(TIM3,ti); //挂接通道2,
}
}
说实在的,将理解写在注释里是多好的习惯。
上一篇:stm32通过IO口模拟输出多路pwm
下一篇:stm32f103 timer1产生400HzPWM
推荐阅读最新更新时间:2024-03-16 16:07