通过控制PWM占空比可以获取我们需要的等效模拟量。
配置好输出模式后,根据CNT与CCR的值输出REF,经过死区生成电路(输出同时接一个MOS管时,两个管子不能同时导通否则会造成短路,而两个管子切换电平状态需要一定时间,生成死区将这段时间延时过去),经过数据选择器选择输出电平的极性最后输出。
PWM配置代码:
#include "stm32f10x.h" // Device header
#include "Timer.h"
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启定时器2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructrue;
GPIO_InitStructrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructrue.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructrue.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructrue);//初始化PA0引脚为复用推挽输出(引脚控制权不一样)
TIM_InternalClockConfig(TIM2);//选择内部时钟源作为时钟/8MHz
TIM_TimeBaseInitTypeDef TimeBaseInitStructrue;
TimeBaseInitStructrue.TIM_ClockDivision= TIM_CKD_DIV1;//
TimeBaseInitStructrue.TIM_CounterMode= TIM_CounterMode_Up;//向上计数模式
TimeBaseInitStructrue.TIM_Period= 100-1;//一个周期的计数值//ARR
TimeBaseInitStructrue.TIM_Prescaler= 720-1;//分频值//PSC
TimeBaseInitStructrue.TIM_RepetitionCounter= 0;//重复计数功能,此处不涉及
TIM_TimeBaseInit(TIM2,&TimeBaseInitStructrue);//读取结构体
/*输出捕获配置*/
TIM_OCInitTypeDef TIM_OCInitStructrue;
TIM_OCInitStructrue.TIM_OCMode=TIM_OCMode_PWM1;//PWM1模式
TIM_OCInitStructrue.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性为高
TIM_OCInitStructrue.TIM_OutputState=TIM_OutputState_Enable;//输出使能
TIM_OCInitStructrue.TIM_Pulse=0; //将值加载到CCR寄存器
TIM_OC1Init(TIM2,&TIM_OCInitStructrue);//初始化
TIM_Cmd(TIM2,ENABLE);//启动定时器
}
/**
* 函 数:设置CCR寄存器的值
* 参 数:要修改的值
* 返 回 值:无
*/
void PWM_SetCompare(uint16_t Compare)
{
TIM_SetCompare1(TIM2,Compare);
}