用51单片机同时实现四路PWM波,(C语言)

用51单片机同时实现四路PWM波,(C语言),第1张

定个时间20ms周期的定时器,然后在定时器到达那些点的时候,让自己设的那些变量依次变化。 再根据自己的变量,付给输出端口就可以了。 看着像舵机的

看了你追问的,原来是四路每一路都产生变化的波形。那个也好办。可以通过计算,把这几个波形统一起来成一个周期,比如开始05ms到了,让定的值取反,再加195再取反,再加13Ms再取反,再加187ms再取反然后一直这样把几个都写完。

还有种方法,来改变第一个pwm的设定值。比如放数组里一共5个设定值,分别代表你设定的高电平时间,依次替换第一个定时器里面的中端时间即可。

当然,前两种都差不多,还有一种方法供你扩展:就是用两个定时器,然后按照时间去匹配修改。当然,51单片机那精度就不说了,不太确信可以达标,一个定时器进中断了,另一个就要停一下。。

BTW,个人感觉51的单片机没有很好的pwm模块,这样写了Pwm程序,别的就干不了了。建议用用带epwm模块的mcu,直接调用epwm和epwm中断,节省cpu资源,可以多写很多程序。

怎么可能搞不了三路独立的呢楼下那位是被STC12C5A60S2的硬件蒙蔽了视线,他认为,STC12C只有两路PWM,无法实现3路,你却忘记了最原始的办法,不要说STC12有PWM功能,即使是传统的AT89S52这类没有PWM功能的单片机也一样能够实现楼主的要求

下面我简单的分析一下我的思路,楼主尝试编程,如果不懂,再追问:

你是用三路独立的PWM调光用的,PWM调光,为了保证不让人眼产生闪烁,理论上PWM的频率要大于20Hz,而在实际的测试用,一般PWM要大于25Hz才能保证不闪烁为了保险起见,我们将PWM的频率设定在30Hz左右,那么,周期就是33333333ms,假设,我们实现10级调光,那个 每级的时间是333333ms

然后设置三个变量和一个计数器,我描述不太清楚,你看一下程序:

sbit P1_0 = P1^0; //---P10,P11,P12是三路PWM输出

unsigned char Set_PWM0 = 0; //--Set_PWM0 Set_PWM1 Set_PWM2

//--分别是低电平占整个脉冲的百分比

//--他们最小取0,最大取9

unsigned char counter = 0;//--用于计数的

void ISR_Timer0(void) interrupt 1 //---我们就用定时器0来做,不用PWM硬件

{ //----33333ms中断一次

counter++;

if(counter >= 10) counter = 0;

if(counter >= Set_PWM0) P1_0 = 0; else P1_0 = 1;

if(counter >= Set_PWM1) P1_1 = 0; else P1_1 = 1;

if(counter >= Set_PWM2) P1_2 = 0; else P1_2 = 1;

}

这样,定时器0用于决定PWM的反占空比,你只要设置 Set_PWM0等三个参数就可以了

怎么会实现不了呢

我觉得可以把PWM信号读入I/O口,定义两个变量,一个high表示高电平,一个low表示低电平,遇到第一个上升沿开始给high+1,遇到第一个下降沿给low+1,遇到第二个上升沿,则停止计数。统计high与low,就可以知道一个周期内,占空比。

给个我自己写的程序你,我试过了,通过!

#include

#define

uchar

unsigned

char

#define

uint

unsigned

int

sbit

P0_0=P0^0;

uchar

a;

/

TH0和TL0是计数器0的高8位和低8位计数器,

计算办法:TL0=(65536-C)%256;

TH0=(65536-C)/256,

其中C为所要计数的次数即多长时间产生一次中断;

TMOD是计数器工作模式选择,0X01表示选用模式1,

它有16位计数器,最大计数脉冲为65536,最长时间

为1ms65536=65536ms

/

void

init_sys(void);

/系统初始化函数/

void

main

(void)

{

init_sys();

while(1);

}

void

init_sys(void)

{

TMOD=0x01;

TH0=(65536-10000)/256;

TL0=(65536-10000)%256;

EA=1;

ET0=1;

TR0=1;

}

void

timer0(void)

interrupt

1

{

TH0=(65536-100)/256;

TL0=(65536-100)%256;

a++;

if(a<=3)

{

P0_0=1;

if(a==3)

//改变低电平持续时间

{

//也即改变占空比

P0_0=~P0_0;

}

}

else

{

P0_0=0;

if(a==5)

//改变周期

{

a=0;

}

}

}

主要通过一个定时器和一个IO口来实现PWM的输出。

在一个周期里面,首先让IO口输出高电平,并定时一定的时间

然后再将IO口输出低电平,定时一定的时间。

然后在while里面循环输出即可。

需要改变占空比的话就改变高电平的时间与低电平的时间比。

以上就是关于用51单片机同时实现四路PWM波,(C语言)全部的内容,包括:用51单片机同时实现四路PWM波,(C语言)、求51单片机PWM程序(一个定时器产生三路PWM 可独立运作) 简单来说就是用三路独立的pwm控制三个LED、怎样用51单片机测量某一pwm信号 请教方法或程序 谢谢!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10631797.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存