快速上手STM32单片机定时器-PWM设定
一、PWM的定义
PWM(Pulse width modulation)意思为脉冲的宽度调制。我们通过调节脉冲的周期、高电平占空比,来实现直流电梯调速、灯光亮度调整的功能。如下图1中脉冲的周期T、占空比P等参数我们均可以实现调节。
图1 矩形方波
二、STM32单片机定时器中PWM实现方法
PWM输出为STM32单片机中定时器的一个功能。实现PWM输出我们需要设置输出波形的周期T、和高电平的占空比。
波形周期是通过定时器的时基参数中预分频系数(PSC预分频寄存器)和自动装载值(ARR寄存器)进行设定。对于此时基设定不清楚的朋友可以看下我之前的视频—定时器时基设定。首先预设比较寄存器CCR的值, 计数寄存器CNT的值与CCR的预设值相比较。根据预先设置,当CNT的值计数到与CCR预设值相等时,输出电平产生跳变。对于占空比的调节,我们可以通过改变CCR的值来调节。下图为ARR寄存器设置为8时,以定时器向上计数模式时电平翻转波形图。当CCR=4,CNT计数到4时输出电平翻转,CCR=8时,CNT计数到4时输出电平翻转。图2 电平翻转波形图
三、STM32单片机定时器中PWM设定方法
STM32CUBE中PWM的设定主要是以下参数,Mode(模式)和CH Polarity(极性)两个参数相互配合,确定PWM的具体输出波形,具体见图4。Pulse参数即为CCR寄存器的参数,设定占空比的。
图3 PWM设定参数
图4 模式、极性与输出电平的关系
四、程序的实现
STM32CUBE生成代码后,首先使用库函数:HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)来开启相应定时器、相应通道的PWM输出;可以使用宏 __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)来改变CCR的值,调节占空比。
五、实验视频
PWM设定视频:快速上手STM32定时器(三)-PWM设定
PWM实验视频:快速上手STM32定时器(四)-PWM实验
单片机之定时器模拟PWM
PWM-脉冲宽度调制,在实际应用中非常广泛,如灯光效果调制、开关电源、电机控制等。一般单片机都会带有PWM模块,单片机自带的PWM模块的优点是控制精度高,使用方便,只需要配置相关寄存器就可以,缺点是IO口固定,能同时输出PWM的路数少。当实际应用时的PWM的精度和频率要求不高,但要同时输出3路以上PWM时,就可以用单片机的定时器来模拟PWM了。本次主要介绍定时器模拟PWM来控制4色(红绿蓝白)LED的灯光效果。
PWM的调制最关键的是控制占空比与周期,本次介绍的PWM的周期固定,在什么时候改变占空比这个很关键。定时器中断时间为50us,PWM周期是50us*200 = 10ms。对于灯光的控制,频率大于50Hz即可,如果想要手机拍摄时没有明显的闪烁,频率最好在100Hz以上,下面来看程序:
void timer0_isr(void) interrupt ISRTimer0 //50us,中断函数
{
TH0 = 249;
TL0 = 254;
//red_led = ~red_led;
timer0_50us_flag = 1;
test_water_50us_flag = 1;
red_led_pwm();
green_led_pwm();
blue_led_pwm();
white_led_pwm();
//control_mist_pwm();
}
void red_led_pwm(void)//红色LED PWM输出函数,在定时器0中调用
{
red_led_count++;//计数用
if(red_led_count > red_led_duty)计数值与占空比比较大小
{
red_led = 0;//如果计数值比占空比数值大,就输出低电平,否则就输出高电平
}
else
{
red_led = 1;
}
if(red_led_count >= red_led_duty_cycle)//判断计数值是否到达周期值
{
red_led_count = 0;//计数值清零
if(goto_step3_flag)
red_led_cycle_times++;//PWM满一个周期后记录当前PWM输出了几个
}
}
其他三种颜色灯的PWM输出函数与红色LED的PWM输出函数一样,在此不做详述。PWM的输出函数非常简单,但是要控制这几种LED显示不同的效果,改变占空比就非常重要了。以下是红色LED占空比控制的程序,在主循环中调用
void red_led_duty_process()
{
if(red_led_cycle_times < 2)
return;
red_led_cycle_times = 0;
if(red_duty_zero_flag)
return;
if(red_begin_decr_flag)
{
red_led_duty--;
if(red_led_duty == 0)
{
red_duty_zero_flag = 1;
red_arrive_half_duty_flag = 0;
blue_duty_zero_flag = 0;
}
return;
}
if(red_duty_full_flag)
return;
if(red_duty_half_flag)
{
red_duty_half_count++;
if(red_duty_half_count < 100)
return;
red_duty_half_count = 0;
red_duty_half_flag = 0;
red_arrive_half_duty_flag = 1;
}
red_led_duty++;
if(red_arrive_half_duty_flag == 0)
{
if(red_led_duty >= 100)
{
red_duty_half_flag = 1;
}
}
if(red_led_duty >= 200)
{
red_duty_full_flag = 1;
green_duty_zero_flag = 0;
blue_duty_full_flag = 0;
}
}
由于在控制占空比的过程中,需要控制每个灯的占空比的变化,在不同的阶段,占空比的变化不一样。这个产品本来只是一个产品的一个功能,看着效果不错就单独拿出来做一个产品,还有汇编版本的。篇幅有限,需要完整的程序代码可以留下邮箱。欢迎大家提问。
相关问答
51 单片机 怎么用一个按键和一个 定时器 来模拟 PWM 控制一个LED灯...使用定时器T0产生PWM方波,用按键调整占空比,20级可调控制led灯的亮度等级.#include"my51.h"#include"timer0.h"...
stc15 单片机 输出 pwm 频率?不同的单片机是不同的,拿STC15系列单片机来说:PWM的频率=PCA时钟输入频率/256PCA的时钟源有以下几种:sysclk,sysclk/2,sysclk/4,sysclk/6,sysclk/8...
51 单片机定时器 不够用怎么办?确实如此,定时器是使用频率最高的资源。STC89C52单片机有3个定时器,分别是T0,T1和T2。一般够用,一个串口波特率发生,2个计时。其中T2有捕捉功能。由于定时器...
stc 单片机 pca做 pwm 输出时怎么把频率降低12分频还是高?CMOD=0X02;//使用定时器0溢出率作为PWM时钟设置定时器0工作方式2(8位自动重装载)设置定时器0初值,就是溢出率,改变这个值就可以改变PWM输出频率其他的就...
跪求stc12c5a60s2 单片机PWM 程序。50%占空比。P1.3口输出 PWM ?#include/******************************************************************************************...
怎么用51 单片机 来实现 pwm 调节占空比?可以用两级中断来实现,该方法可实现精确占空比与频率的调整。。。大致思想是:1.在定时器T0中开定时器T1,并使pwm=1,2.在定时器T1中关掉T1,即TR1=0;并使pw...
普通的IO口为什么可以模拟 PWM 信号?PWM英文全拼就是PlUSEWIDTHMODE也就是脉冲宽度调制。它的参数就是有频率和占空比,当然还有峰值电压。然而单片机的IO口,一般都具有高低电平输出的功能。然而...
CPU风扇是 PWM 控制好还是电压控制好?建议用PWM。控制原理来完成对直流电机的正转、反转以及其加速、减速过程的控制,在此过程中是通过单片机的定时器加上中断的方式产生不同时长的高低电压脉冲信...
STM8S如何设置timer1 定时器 不产生中断,用查询得知计时到达?一般用两个定时器生成PWM波,一个负责周期,一个负责占空比。补充:设有两个定时器timer00和timer01,timer00计时为T00,并产生中断INTP00;timer01计时为T01,...
模拟传感器想要用 PWM 输出,有什么合适的芯片可以支持吗?按我的理解,题主的意思是应该是按传感器检测到的电压或者电流信号大小输出不同占空比的PWM信号因为没有比较具体的要求,比较通用的情况下用一个简单的单片机就...