产品概述

单片机 模拟 pwm 单片机之定时器模拟PWM

小编 2025-07-05 产品概述 23 0

单片机之定时器模拟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;

}

}

由于在控制占空比的过程中,需要控制每个灯的占空比的变化,在不同的阶段,占空比的变化不一样。这个产品本来只是一个产品的一个功能,看着效果不错就单独拿出来做一个产品,还有汇编版本的。篇幅有限,需要完整的程序代码可以留下邮箱。欢迎大家提问。

单片机功能——PWM脉冲宽度调制

夏天在户外没有空调的庇护,小风扇就成了我们纳凉的重要工具。热了就把风速调大、凉了就把风扇的风速调小,总的来说风速得跟着体感舒适度走。小风扇的转速控制是利用PWM控制来调节,PWM驱动信号施加到连接至风扇的高侧或低侧的场效应晶体管(field-effect transistor,FET) 上。在特定频率k开关风扇,通过PWM信号的占空比(duty cycle)来控制风扇转速。

而这里说的小风扇风速控制就涉及到了接下来我们要说的单片机知识点——PWM脉冲宽度调制。

PWM是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。

PWM脉冲宽度调制具有两个非常重要的参数:频率和占空比。频率和周期是互为倒数的,占空比是指一个周期内高电平所占的比例。PWM信号就是根据需求调节占空比的大小以实现负载端电压的线性变化。

PWM的优点之一是从处理器到控制系统的信号是数字形式的,并且不需要数模转换。只有当噪声强度足以将逻辑1转换为逻辑0或逻辑0转换为逻辑1时,噪声也会影响数字信号。

抗噪声能力的提高是PWM相对于模拟控制的另一个优点,也是PWM在某些时候用于通信的主要原因。从模拟信号切换到PWM可以大大延长通信距离。在接收端,通过适当的RC或LC网络将调制后的高频方波滤除,信号恢复为模拟形式。

芯海的CSU38F20H芯片中带有3路PWM输出,一路互补PWM输出,可适用于个人护理、电池管理、消防标志灯等领域。

相关问答

怎么用 单片机模拟PWM 控制RGB灯颜色渐变?

可调的三路PWM输出,仿真实例你可以修改成自己需要的功能。可调的三路PWM输出,仿真实例你可以修改成自己需要的功能。

智能小车如何实现 PWM 调速?

不需要单独的PWM模块,仅靠单片机和电机驱动(L298N)足够了。具体是在程序中用单片机的IO口模拟出PWM信号来,也就是控制IO口输出的高低电平的时间,利用不同时...

单片机PWM 程序是肿么编写的啊,能给一个简单的例子吗?-ZOL问答

有PWM功能的单片机入STC12系列单片机,直接给专用寄存器赋值开启相应定时器就可以了。普通单单片机,PWM需要用自己来调配。比如:#includeunsigne...

51 单片机pwm 程序详解?

51单片机的pwm调速频率主要通过一个定时器和一个IO口来实现PWM的输出。在一个周期里面,首先让IO口输出高电平,并定时一定的时间然后再将IO口输出低电平,定时一...

8位 单片机 PID控制 PWM 的算法如何实现,C语言计算? - 177****7...

直接配置单片机PWM输出的占空比就行了啊能帮我设计一个用单片机控制PWM占空比再控制可控硅的开端的硬件及程序。如果有发至liu983580@163.com

单片机 有多少 PWM 输出的引脚 - Sz 的回答 - 懂得

PWM功能,不同单片机有所不同。一般指的PWM是指单片机包含硬件PWM模块,不需要软件模拟,可实现稳定、高速的PWM占空比输出,且不占用太多软件资源。部...

单片机 输出 pwm 默认频率?

单片机输出PWM默认频率取决于具体的单片机型号和配置。大多数单片机默认的PWM频率在几十kHz到几百kHz之间。这个频率是由单片机的时钟源和预分频器决定的。在...

stc15 单片机 输出 pwm 频率?

不同的单片机是不同的,拿STC15系列单片机来说:PWM的频率=PCA时钟输入频率/256PCA的时钟源有以下几种:sysclk,sysclk/2,sysclk/4,sysclk/6,sysclk/8...

如何将 单片机 输出的 PWM 控制信号,变成可以带负载的变化的电压?

单片机输出的PWM为控制信号,需要加入控制器件才可以驱动负载单片机输出的PWM驱动能比较弱,不能直接驱动负载,需要三极管、MOS管参与才可以控制负载的功率,比...

单片机pwm 控制的基本原理?

单片机PWM(脉冲宽度调制)控制的基本原理是通过不断地在一个固定的时间周期内调整脉冲的宽度,来控制输出信号的电平。具体地说,当脉冲的宽度越大,输出信号的...

猜你喜欢