1,51单片机如何用这个实现pwm信号

你的问题 按键三只 用中断功能 实现 加速 减速 停止 方法是用pwm来实现 得到按钮的中断信息 改变 PWM 占空比 就是改变定时器就可以实现的
就是在信号脚上不停地变换高低电平,占空比就是改变高低电平变换时延时,可以在延时函数中加个变量,通过按钮控制变量的变化来改变占空比.
1. 可以;2. 一码事,只不过复杂一点。

51单片机如何用这个实现pwm信号

2,怎么实现用单片机控制的PWM发生电路

这种电路主要是在单片机的程序,只要单片机有定时器,就可以利用CCR实现PWM输出,或是有PWM输出专用的模块也可以实现PWM输出。对后输出后的信号只需要根据需要加驱动电路就可以了,一般是半H桥居多。
1,使用单片机的IO口输出PWM新年好,由程序模拟.2,使用pWM芯片,如uC3842等.
你可以选带有PWM功能的单片机,只要很简单的程序就可以了,当然你可以去STC的网站上看看,STC单片机有带的,有例程,如果不懂,还可以打电话给他们的工程师.
这个东西说白了不是很复杂,首先了解pwm原理就百度百科好了,写论文的时候直接粘贴就行,单片机实验pwm更简单,只要你学过嵌入式应该就会的,拿51单片机来说就是i/o端口作为pwm输出,注意下单片机的总输入/输出电流不要超过设计范围就行,这方面查说明书就行,最后制作电路并实现没啥说的,一个单片机,i/o口上接个限流电阻再接个led,这就是最简单的,如果不明白建议你找导师问问,只要知道要做成什么样就一切ok。

怎么实现用单片机控制的PWM发生电路

3,51单片机怎么模拟PWM波

有两个选择,要么用延时函数,要么用中断,一个一个定时器控制周期,一个控制脉宽
pwm的意思是“脉冲宽度调制”pwm有两个最基本的参数:频率、占空比。频率就是每秒钟电平高低变化的次数,占空比是指高电平保持时间和整个脉冲周期中的比例关系。对于用定时器来模拟,最基本的方法就是使用一个io口循环设置其输出值为高电平和低电平。那么定时器在这里起计时作用,而且需要两个时间:高电平持续时间、低电平持续时间。只要做到这两个时间的计时,那么就可以实现基本的pwm了。而要做到两个时间的计时,有两种方案:1.单计时器方案int i;//计时变量timer1() //此处示例每隔100个最小计时周期电平变化一次,即200个最小计时周期闪烁一次 i++; if (i==200) i=0;//变量复位,完成一个周期,准备下一个周期 } else if (i==100) led_off;//关灯 } else if (i==0) led_on;//开灯 }}2.双计时器方案//只需要设计好两个计时器的初值和周期,即可完成交替亮灭timer1() //此处示例每隔100个最小计时周期电平变化一次,即200个最小计时周期闪烁一次 led_on;//开灯}timer2() led_off;//关灯}

51单片机怎么模拟PWM波

4,51单片机怎样做PWM

你用定时器开中断吧,如果只是简单的用IO口的话,得到的频率很不准确的!思路:根据单片机的晶振大小计算定时器的初值,在中断程序里给对要输出脉冲的引脚取反操作就是了,例如:P1^0=~P1^0;还有脉冲频率不能太高哦,要保证定时器的计时时间大于中断程序执行时间~~程序大体结构: void Init_timer() //定时器初始化 } void main() //主程序 } void t0() interrupt 1//t0的中断程序 }
直接用51的增强版stc89c52就ok啦,芯片内部自带有pwm波产生器,直接操作,方便得很
输出高电压,设置定时器时间为高电压宽度, 定时器中断到后,拉低电压,重新设置定时器时间为低电压宽度. 定时器中断到后在拉高电压. 重复开始的步骤
STC的部分51单片机可以使用相关寄存器实现PWM功能,不用编写复杂的程序(即不用中断了),当然我一直看不懂STC编写的说明书,所以一边都用AVR单片机来制造PWM,而且非常简单。

5,51单片机实现pwm对电机调速

可以用一个定时器实现,也可以用两个定时器实现一个定时器实现办法,如定时器定时50US中断一次,中断100次是5ms,即PWM的周期每次中断,变量a加1,并且a与另一变量b比较,如果a<b,让某一管脚输出高电平,如果a>=b,则让其输出低电平,a等于100时清0,这样占空比是b/100,改变b的值,就可以改变占空比 缺点定时器定时时间不能太短,例如10us中断程序根本执行不完,若占空比调节精度要求较高,如要求百分之一,则a需大于100,这样PWM波的周期就比较大,频率比较低两个定时器,如一个定时器0定时100us,另外一个定时器1定时小于100us,如b us定时器0中断时输出高电平,并打开定时器1,定时器1负责置低电平这样,就可以产生周期100us,占空比是b/100的方波 频率可以比用一个定时器高一些
#include<reg51.h>#define uchar unsigned charsbit pluse=P1^0;uchar pwm=50;uchar cnt;void t0isr() interrupt 1cnt++;if(cnt<pwm)pluse=0;else pluse=1;cnt%=100;}main()TMOD=0x02;TH0=TL0=206;TR0=1;ET0=1;EA=1;while(1);}
直流电机的pwm调速,就是改变在一个周期里的通电时间,通电时间和断电时间就是一个周期,这都是用时间来决定的,所以必须要用定时器。 51单片机是对所有兼容intel 8031指令系统的单片机的统称。该系列单片机的始祖是intel的8031单片机,后来随着flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是atmel公司的at89系列。

6,51单片机怎么产生12路PWM波

最简单的是启动定时器,中断中控制12个IO输出
我来说一下我的方案,这个我验证过,方法如下: 其实用一个定时器就够了,外部中断接按键,一个用来频率加,一个用来频率减,即做调节频率用,8路频率从p0口输出,定时器产生中断,比如1us,那么我到1us时对p0.0取反,同时中断里在定义一个变量t1,那么t1计中断次数,假如计到5时我让p1.0取反,儿至于计到几有外部中断来定义,比如定义一个全局变量f,int0按一次则f++,int1s按一次f- -,如此频率得以控制,定时器处理如下: void time0_isr(void) interrupt 2 t1++; if(t1==f) p00=~p00; if(t1==f) p01=~p01; if(t1==f) p02=~p02; if(t1==f) p03=~p03; if(t1==f) p04=~p04; if(t1==f) p05=~p05; if(t1==f) p06=~p06; if(t1==f) } 当然这只是简单的用51本身资源产生而已,还可以用专门的外围电路来实现,我给你一个四路频率产生程序,思想如上,已验证过/*************************四路频率产生器***************************************/#include#define uchar unsigned char #define uint unsigned int /*************************常量定义***************************************/ sbit pwm1=p1^0; //第一路频率 1s内产生5000个脉冲 sbit pwm2=p1^1; //第二路频率 1s内产生1000个脉冲 sbit pwm3=p1^2; //第三路频率 1s内产生2500个脉冲 sbit pwm4=p1^3; //第四路频率 1s内产生500个脉冲 uchar cout1,cout2; //分别用来定义时间宽度 uchar t0_max=10,t1_max=100; /*******************定时器0初始化函数***************************************/ void time0_ini() //定时0初始化 { tmod=0x02; //采用定时器0,选择模式2 th0=0xa3; //0.1ms定时 tl0=0xa3; et0=1; //允许定时器溢出中断 tr0=1; //启动定时器 } /***************************外部中断0初始化***********************************/ void int0_ini() { ex0=1; //外部中断0允许 it0=1; //选择边沿触发方式 } /***************************定时器1初始化*****************************************/ void time1_ini() { tmod=0x20; //采用定时器1,选择模式2 th1=0xa3 ; //定时0.1ms tl1=0xa3; et1=1; //允许定时器中断 tr1=1; //启动定时器1 } /*************************主函数************************************************/ void main() { time0_ini(); //调用定时器0初始化函数 time1_ini(); //调用定时器1初始化函数 int0_ini(); cout1=0; cout2=0; pwm1=0; //没一路频率都从低电平开始 pwm2=0; pwm3=0; pwm4=0; ea=1; //打开总中断 while(1); //一直停留在主函数中 } /***************************定时器中断服务程序************************************/ void tim0_isr() interrupt 1 //定时0中断服务程序 { cout1++; //计数变量加1 if(cout1==t0_max) { pwm1=~pwm1; //每当到了1ms时取反一次电平,即周期为2ms,1s内产生500个脉冲 } if(cout1==(t0_max+10)) { cout1=0; //每当到了2ms时取反一次电平,即周期为4ms,1s内产生250个脉冲 pwm2=~pwm2; } } /**************************定时器1中断服务程序************************************/ void time1_isr() interrupt 3 //定时器3中断服务程序 { cout2++; if(cout2==t1_max) { pwm3=~pwm3; //每当到了10ms时取反一次电平,即周期为20ms,1s内产生50个脉冲 } if(cout2==(t1_max+150)) { cout2=0; //每当到了25ms时取反一次电平,即周期为50ms,1s内产生20个脉冲 pwm4=~pwm4; } } /********************外部中断0服务程序**************************/ void int0_isr() interrupt 0 { if(t0_max>200) t0_max=10; //清楚上限 if(t1_max>2000) t1_max=100; t0_max=t0_max+10; t1_max=t1_max+100; }
定时器定时一个基本的时间片。。然后通过12个IO口就可以输出PWM波了

7,如何用单片机产生PWM

/*---------------文件名称: PWM.C功能 :单片机脉冲方式产生PWM信号----------------*/#include <reg52.h> // 引用标准库的头文件#include <absacc.h>#include <stdio.h>#define uchar unsigned char#define uint unsigned int#define COUNT0 XBYTE [0X0000] // 8254计数器0寄存器地址#define COUNT1 XBYTE [0X0200] // 8254计数器1寄存器地址#define COUNT2 XBYTE [0X0400] // 8254计数器2寄存器地址#define COMWORD XBYTE [0X0600] // 8254控制寄存器地址/********************************函数名称: SIGNAL(SIG_OUTPUT_COMPARE1A)功能 :定时器0中断子程序入口参数:无返回值 :无********************************/void time0_int () interrupt 1 using 1 TR0=0; // 关闭T0 TH0=-(20000/256); TL0=-(20000%256); //重置20ms计数值/*--------------用8254计数器发送第一路的PWM信号-----------*/ COMWORD=0x30; //1MHz时钟作为计数时钟,计数1000次后实现1ms高电平 COUNT0=0xE0; COUNT1=0x03;/*--------------用8254发送第二路的PWM信号----------------*/ COMWORD=0x70; //1MHz时钟作为计数时钟,计数2000次后实现2ms高电平 COUNT0=0xD0; COUNT1=0x07;/*-------------用8254发送第三路的PWM信号----------------*/ COMWORD=0xB0;//1MHz时钟作为计数时钟,计数3000次后实现32ms高电平 COUNT0=0xB0; COUNT1=0x0B; TR0=1; //启动T0}//主函数 void main () EA=1; // 开CPU总中断 ET0=1; // 开T0定时器中断 TMOD=0x01; // 开定时器中断 TH0=-(20000/256); //20ms定时器计数初值 TL0=-(20000%256); /*--------------向8254控制寄存器选择计数器0,并对其赋值0-----------------*/ COMWORD=0x30; COUNT0=0; //赋低位字节 COUNT0=0; //赋高位字节 /*---------------向8254控制寄存器选择计数器1,并对其赋值0------------------*/ COMWORD=0x70; COUNT0=0; //赋低位字节 COUNT0=0; //赋高位字节 /*---------------向8254控制寄存器选择计数器2,并对其赋值0-----------------*/ COMWORD=0xB0; COUNT0=0; //赋低位字节 COUNT0=0; //赋高位字节 TR0=1; //启动定时器0 While (1); //无限次循环}
就是定时器输出脉冲,频率由写入的到寄存器的值确定 输出频率=定时器工作频率/定时器寄存器的值当然如果是avr的单片机就不是这样算了,要看工作在什么模式下
用普通i/o口采用软件定时器中断可以模拟pwm输出/*采用6mhz晶振,在p1.0脚上输出周期为2.5s,占空比为20%的脉冲信号*/ /*定时100ms,周期2.5s需25次中断,高电平0.5s需5次中断*/ #include typedef unsigned char uchar; sbit p1_0=p1^0; uchar time=0; uchar period=25; uchar high=5; void timer0() interrupt 1 using 1 th0=0x3c; /*定时器初值重装载*/ tl0=0xb0; time++; if(time==high) /*高电平持续时间结束,变低*/ else if(time==period) /*周期时间到,变高*/ p1_0=1; } } void main() tmod=0x01; /*定时器0方式1*/ th0=0x3c; /*定时器装载初值*/ tl0=0xb0; ea=1; /*开cpu中断*/ et0=1; /*开定时器0中断*/ tr0=1;/*启动定时器0*/ while(1) /*等待中断*/ }

文章TAG:51单片机怎么实现pwm单片机  怎么  实现  
下一篇