单片机定时器占空比问题,麻烦写个程序!程序!程序!加注释最好了...
展开全部 #include#define uchar unsigned charuchar pwm=5,cnt=0;sbit pluse=P1^0;void t0isr() interrupt 1{cnt++;cnt%=40;if(cnt10)pwm=10; }}main(){TMOD=0x22;SCON=0x50;TH0=6;TL0=6;TR0=1;ET0=1;ES=1;TR1=1;EA=1;}...
51单片机产生pwm波的c程序是什么?
用定时器产生程序如下:unsigned int a=0 ,b=10;void main(){ TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void PWM() interrupt 1{ TH0=(65536-50000)/256; TL0=(65536-50000)%256 ; a++; P1^1=0; if(a=20) { a=0; } if(a=b) { P1^1=1; }}调节a ,b的值即可调节占空比,程序框架就是这样,具体自己改吧...
求助大佬!!如何用51单片机定时器产生pwm波啊?本人小白一个,...
12345678910111213141516171819202122 #include#define uchar unsigned charuchar pwm,cnt;sbit pluse=P1^0;voidt0isr() interrupt 1{cnt++;if(cntelsepluse=0;if(cnt>100)cnt=0;}main(){TMOD=0x02;TH0=156;TL0=156;TR0=1;ET0=1;EA=1;pwm=20;while(1);}...
用51单片机同时实现四路PWM波,(C语言)
这个可以实现的,具体的程序可以根据思路来1:通过计算,把这几个波形统一起来成一个周期,比如开始0.5ms到了,让定的值取反,再加19.5再取反,再加1.3Ms再取反,再加18.7ms再取反...然后一直这样把几个都写完。
2:改变第一个pwm的设定值。
比如放数组里一共5个设定值,分别代表你设定的高电平时间,依次替换第一个定时器里面的中端时间即可。
3::是用两个定时器,然后按照时间去匹配修改。
。
。
建议用用带epwm模块的mcu,直接调用epwm和epwm中断,节省cpu资源,可以多写很多程序。
参考《吴鉴鹰单片机项目实战精讲》,吴鉴鹰单片机开发板教程
单片机PWM控制RGB
RGB-LED变化出64中不同的颜色,......----每种颜色的LED,要有四种亮度。
三种颜色搭配,就有 64 种颜色了。
每种颜色的LED,要有四种亮度:不亮、1/3亮、2/3亮、全亮。
其实,并不难控制。
都用不上 PWM 控制器。
用一个定时器,每隔一毫秒中断一次,对三路输出,控制一下即可。
脉冲宽度调制的具体过程
通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
脉冲宽度调制1. 详细释义:是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
2. 基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。
也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。
3. 优点:从处理器到被控系统信号都是数字形式的,无需进行数模转换。
让信号保持为数字形式可将噪声影响降到最小。
噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。
pic用作PWM输出时定时器如何计算
你这那是后分频6啊,T2CON = 0X55,就是01010101,就是后分频为(1:11),打开定时器2,预分频为(1:4).也就是说16M的时钟频率在输入到T2之前是16M/4=4M,1/4M=0.25微秒(即0.25微秒为一个指令周期)。
而预分频是1:4,则定时器2在0.25*4=1微秒的时间内自增一次TMR2。
则每90微秒内TMR2和PR2比较的结果相同并溢出一次。
再加上是后分频为11,则90*11 = 990微秒 = 0.99毫秒。
约等于1毫秒。
看清楚T2CON的位定义描述。
请问下,PWM用定时器0控制电压输出,如何控制
呵呵 没看懂你的程序 给你段我的调速程序吧,用了两个定时器,有点费,或许对你有帮助的…………#include sbit rs=P0^0; sbit rw=P0^1; sbit en=P0^2; sbit sensera=P1^0; sbit senserb=P1^1; sbit senserc=P1^2; sbit senserd=P1^3; sbit in1=P1^4; sbit in2=P1^5; sbit in3=P1^6; sbit in4=P1^7; int left_low,left_high,right_low,right_high; unsigned char leftsign,rightsign; unsigned char leftback,rightback; void timer0init() { TMOD=0x01; TH0=0x00; TL0=0x00; EA=1; ET0=1; TR0=1; } void timer0(void) interrupt 1 { if(leftback) { leftsign=!leftsign; if(!leftsign) { TH0 =(65536-left_low)/256; TL0 =(65536-left_low)%256; in1=0; in2=0; } if(leftsign) { TH0=(65536-left_high)/256; TL0=(65536-left_high)%256;; in1=1; //倒转 in2=0; } } else { leftsign=!leftsign; if(!leftsign) { TH0=(65536-left_low)/256; TL0=(65536-left_low)%256; in1=0; in2=0; } if(leftsign) { TH0=(65536-left_high)/256; TL0=(65536-left_high)%256;; in1=0; in2=1; } } } void timer1init() { TMOD=0x10; TH1=0x00; TL1=0x00; EA=1; ET1=1; TR1=1; } void timer1(void) interrupt 3 { if(rightback) { rightsign=!rightsign; if(!rightsign) { TH1=(65536-right_low)/256; TL1=(65536-right_low)%256; in3=0; in4=0; } if(rightsign) { TH1=(65536-right_high)/256; TL1=(65536-right_high)%256; in3=1; in4=0; } } else { rightsign=!rightsign; if(!rightsign) { TH1=(65536-right_low)/256; TL1=(65536-right_low)%256; in3=0; in4=0; } if(rightsign) { TH1=(65536-right_high)/256; TL1=(65536-right_high)%256; in3=0; in4=1; } } } void testsenser() //左 直 右 停 后(01234)大拐 小拐 无意义(310) { if((sensera==0&&senserb==0&&senserc==0&&senserd==1)||(sensera==0&&senserb==1&&senserc==1&&senserd==1)) // 右大拐 { leftback=0; rightback=1; ET0=1; ET1=1; left_high=20000; left_low=40000; right_high=20000; right_low=40000; } else if((sensera==0&&senserb==0&&senserc==1&&senserd==1)||(sensera==0&&senserb==0&&senserc==1&&senserd==0))// 右小拐 { leftback=0; rightback=1; ET0=1; ET1=1; left_high=20000; left_low=40000; right_high=10000; right_low=40000; } else if((sensera==1&&senserb==0&&senserc==0&&senserd==0)||(sensera==1&&senserb==1&&senserc==1&&senserd==0)) // 左大拐 { leftback=1; rightback=0; ET0=1; ET1=1; left_high=20000; left_low=40000; right_high=20000; right_low=40000; } else if((sensera==1&&senserb==1&&senserc==0&&senserd==0)||(sensera==0&&senserb==1&&senserc==0&&senserd==0)) // 左小拐 { leftback=1; rightback=0; ET0=1; ET1=1; left_high=10000; left_low=40000; right_high=20000; right_low=40000; } else if(sensera==1&&senserb==1&&senserc==1&&senserd==1)// 停 { leftback=0; rightback=0; ET0=0; ET1=0; in1=0; in2=0; in3=0; in4=0; } else if(sensera==0&&senserb==0&&senserc==0&&senserd==0)// 后退 { leftback=1; rightback=1; ET0=1; ET1=1; left_high=10000; left_low=50000; right_high=10000; right_low=50000; } else //直走 { leftback=0; rightback=0; ET0=1; ET1=1; left_high=10000; left_low=50000; right_high=20000; right_low=50000; } } void main() { timer0init(); timer1init(); while(1) testsenser(); }
单片机控制PWM,用到双向可控硅。
怎样设计相关电路图和程序(C语...
这个我经常用,电机调速控制,严格说这不是PWM,是可控硅移相触发。
电路很简单,一个可控硅触发电路,一个过零检测电路,配合一段中断服务程序就能完成。
不知道你应用的一些详情,简单说一下思路。
可控硅触发一般使用MOC3021,相关手册上有典型电路,CPU端接一个GPIO就可以。
闭环控制时过零检测不需要很精确,一般用一个双向光耦就足够,光耦输入接交流电输入,输出接CPU中断,用史密特整形一下输出信号最好。
中断程序的结构分成两部分,过零中断与延时中断。
过零中断做两件事,输出复位,开始延时。
如果定时器有外部管脚复位启动功能,可以不要这段。
延时中断做一件事,触发输出。
如果定时器有触发输出功能,可以没有这段中断程序。
具体的延时时间,由主程序控制,一般是根据PID的计算结果进行设置。
注意,延时时间越长,输出电压越小。
转载请注明出处51数据库 » pwm定时器软件编程步骤
花仙子_flowergod