个人估计理解这个图片就差不多明白PWM了。用定时器的加减也一样
使用PWM的时候要看PWM的相关IO引脚。CH1-CH4 对应OC配置的OC1-OC4
频率计算可以看前面的定时器文章。
PWM配置过程:
1:初始化相关的PWM引脚
2:初始化配置定时器 TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseInitStruct);
3:配置OC TIM_OC3Init(TIM3,&TIM3_OCInitStruct);这个要看相关引脚
4:开启定时器就可以了。CMD
配置占空比函数 :TIM_SetCompare3(TIM3,0)
选项:开启影子寄存器://void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
计算设置占空比时,是马上写入CCR,还是下一个周期写入。
GPIO配置:
/*
函数名:void rgb_init(void)
功能:初始化GPIOB
形参:
*/
void rgb_init(void)
{
GPIO_InitTypeDef GPIOB_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//开启GBIOB的时钟
GPIOB_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//GPIO模式 复用推挽//手册有说明
GPIOB_InitStruct.GPIO_Pin=GPIO_Pin_0;//引脚选择
GPIOB_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//输出速度
GPIO_Init(GPIOB,&GPIOB_InitStruct);
GPIO_SetBits(GPIOB,GPIO_Pin_0);//初始化时电平置高//电路驱动默认不启动
}
定时器和OC配置及开启(PWM配置)
/*
函数名:void time3_init(void)
功能:初始化定时器3
形参:
*/
void time3_init(void)
{
TIM_TimeBaseInitTypeDef TIM3_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM3_OCInitStruct;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启定时器2的时钟
TIM3_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//定时器不分频 分频 系统时钟/分频
TIM3_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计时模式 向上
TIM3_TimeBaseInitStruct.TIM_Period=99;//ARR 重装载
TIM3_TimeBaseInitStruct.TIM_Prescaler=719;// PSC预分 实际计算 定时器时钟/arr+1/per+1=时间 1/时间=
TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseInitStruct);
TIM_OCStructInit(&TIM3_OCInitStruct);
TIM3_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//设置为PWM模式1,
TIM3_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//PWM口的输出极性
TIM3_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//开启PWM输出
TIM3_OCInitStruct.TIM_Pulse=0;//CCR的第一次比较值
TIM_OC3Init(TIM3,&TIM3_OCInitStruct);
TIM_Cmd(TIM3,ENABLE);//定时器开始定时
TIM_SetCompare3(TIM3,0);//设置PWM占空比 50和重装载是有点关系的,CCR的值不能超过重装载。 现在是占空比50.
// 备注:这个函数会决定CCR的值是马上更新还是下一个周期更新 TIM_SetCompare3(TIM3,50);
//void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
//ARPE:自动重装载预装载允许位 (Auto-reload preload enable)
//0:TIMx_ARR寄存器没有缓冲;
//1:TIMx_ARR寄存器被装入缓冲器。
}
到此就可以用TIM_SetCompare3函数去设置占空比了,占空比和ARR是有关系的,设置的占空比比可以超过ARR,
PWM可以用到步进驱动器;频率为速度。占空比一般为50,要开启中断。TIM_IT_CCX。比较寄存器的中断,看是那个,选择那个。