前一阵做的项目牵扯到PWM调制电压,调节直流电机的速度,设置方式等都是相同的在频率一致的时候我们只需要调制PWM的占空比即可调整输出的电压的值,调节直流电机的速度。在此就调节电压的例子来说明PWM调节输出电压,做一个记录出来
从上图可以看到207的定时器有4个通道可以作为PWM通道的输出,我们选择time3的通道2 在PB5引脚输出,PB5可用作TIMER3_CH2通道的输出,如下图所示
- 首先初始化配置PB5作为TIMER3_CH2功能
void Pwm_Gpio_Voltage_Config()//µ÷ÖƵçѹµÄPWM²úÉú²¨ÐÎ
{
GPIO_InitTypeDef GPIO_InitStructure;
u32 PrescalerValue = 0;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//???????
/*GPIOB_Pin_5, TIM4_Channel2 PWM*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3);//GPIOB_Pin9 TIM4_Ch4N,
TIM_DeInit(TIM3);
/* Compute the prescaler value */
PrescalerValue = (uint16_t) ((120000000/2) / 20000000) - 1;
/* Time base configuration */
TIM_TimeBaseStructure.TIM_Period = 1330*2;//ARR ??????PWM??????
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;//PSC ??????TIMx???????????
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 333;//?????
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//??????,???????????????
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM3, ENABLE);
/* TIM4 enable counter */
TIM_Cmd(TIM3, ENABLE);
}
- 改变PWM的占空比输出
void PWM_SET_Voltage(uint32_t VoltageValue)//ÉèÖÃÕ¼¿Õ±ÈÉèÖóöÀ´µÄµçѹµÄÖµ
{
TIM3->CCR2 = VoltageValue;
}
- 主函数测试
void main()
{
PWM_SET_Voltage(500);
}
可以在PB5引脚测到不同占空比的波形输出,后端可以加上PWM控制电压的芯片,即可输出不同的电压的值。