新闻中心

EEPW首页>嵌入式系统>设计应用> STM32单片机学习---PWM输出

STM32单片机学习---PWM输出

作者: 时间:2016-11-27 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/201611/322220.htm

下面是TIM配置函数,注释很清楚了,不作说明:

void tim2_cfg()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

TIM_DeInit(TIM2);
TIM_InternalClockConfig(TIM2);
//预分频系数为72,这样计数器时钟为72MHz/72 = 1MHz
TIM_TimeBaseStructure.TIM_Prescaler = 72;
//设置时钟分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//设置计数器模式为向上计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//设置计数溢出大小,每计1000个数就产生一个更新事件
TIM_TimeBaseStructure.TIM_Period = 1000-1;
//将配置应用到TIM2中
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

//禁止ARR预装载缓冲器
TIM_ARRPreloadConfig(TIM2, DISABLE);

TIM_Cmd(TIM2, ENABLE);//使能TIMx外设
}

接下来是关键的PWM的配置函数:

void pwm_cfg()

{

//设置缺省值

TIM_OCStructInit(&TimOCInitStructure);

//PWM模式1输出

TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

//设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%

TimOCInitStructure.TIM_Pulse = 400-1;

//TIM输出比较极性高

TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

//使能输出状态

TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

//TIM2的CH2输出

TIM_OC2Init(TIM2, &TimOCInitStructure);

//设置TIM2的PWM输出为使能

TIM_CtrlPWMOutputs(TIM2,ENABLE);

}

stm32固件库的输出比较单元结构体与定时器的时基单元是分开定义的,而PWM模式只是输出比较结构体成员TimOCInitStructure.TIM_OCMode的一个取值,当把此结构体填充完后,还要映射到某个定时器,用TIM_OCXInit函数实现,我用了一个X,说明不止一个这样的函数,事实上,stm32的通用定时器都有四个通道,每个通道对应一个初始化函数,这里真够纠结的!最后还要使能该定时器的PWM输出功能,TIM_CtrlPWMOutputs(TIM2,ENABLE)函数要注意,是outputs而不是output,说明TIM2不止一个通道嘛!够复杂,够繁琐的!

下面是输出比较单元的结构体原型:

typedef struct
{
uint16_t TIM_OCMode;

uint16_t TIM_OutputState;

uint16_t TIM_OutputNState;

uint16_t TIM_Pulse;

uint16_t TIM_OCPolarity;

uint16_t TIM_OCNPolarity;

uint16_t TIM_OCIdleState;

uint16_t TIM_OCNIdleState;
} TIM_OCInitTypeDef;

其中没有加色的成员是高级定时器才有的,通用定时器就不用管了。

这里还有个TimOCInitStructure.TIM_OCPolarity成员需要注意,它有什么作用呢?在网上查的资料,如下图:

前面说到pwm有pwm1和pwm2两种模式,这两种模式只能控制到OCXREF为止,TIM_OCPolarity 能控制OC1是直接等于OCXREF,还是取反极性!OC1才是最终的PWM信号。

这里有个小插曲,我用示波器去测量PWM信号,发现信号居然是双极性的,然后改变TIM_OCPolarity ,再测,还是双极性,只是倒了个跟头。还真以为stm32单片机能输出两极性的PWM,后面把示波器改为直流档(之前用的是交流档),波形才从零电位一下纵向移上去。以后要注意!


上一页 1 2 下一页

关键词:STM32单片机PWM输

评论


技术专区

关闭