导航:首页 > 操作系统 > 单片机pwm程序

单片机pwm程序

发布时间:2022-05-06 22:02:39

单片机pwm程序

有二种情况,第一,如果你所使用的8051单片机(例如stc12系列)是带有专用的pwm输出i/o口的话,那就只要控制里面的特殊功能寄存器改变输出占空比就行了,不要外加什么硬件电路的。第二,如果是通入软件模拟pwm输出的话,那就用定时器可以解决的,也不需要外加电路。

Ⅱ stc单片机产生pwm,这有一个程序,有人能详细解释下它怎么产生pwm波吗,能逐句详解吗

哥们,这个已经很详细了;
大概说说吧,PWM[54]是定义的一组PWM脉宽输出数组,PWM脉宽输出是0-255;0的时候脉宽输出最大,255的时候脉宽输出最小;
然后那个初始化PCA,初始化定时器0就不说了,你自己下一个手册看下就明白;
然后是中断,每中断一次index加1,然后判断index是不是等于54,意思就是PWM[54]整个数组里面的PWM是不是都送了一次CCAP寄存器;如果都数组都送了一次,将index置零,从头开始送;标志位取反,如果标志位zf=1,让P14输出PWM,P13关闭;,如果zf=0,让P13输出PWM,P14关闭;if(zf==0)后面的语句就是让PWM[54]中的每一个数都送CCAP寄存器一次;

其实按这个程序注释的话,他本意是PWM波形从小变大P14输出,PWM波形有大变小P13输出;但是这个程序的实际效果是P14由小变大再由大变小。然后P14关闭,P13由小变大再由大变小
如此循环;

你最关心的PWM怎么输出:就是这两个语句,CCAP0H=pwm[index]; CCAP1H=pwm[index]; index每中断一次加1,那么index是由0加到54,假如说index=0 ,那么CCAP0H=pwm[0]; ,pwm[0]对应数字里面的255,寄存器CCAP0H=255;这个寄存器等于255,PWM输出就是一个小脉宽;下一次中断CCAP0H=240了,脉宽有增加了一点;至于CCAP0H送一个数据就有脉宽输出,这个是由单片机硬件本身决定的;你看看手册就知道了;
这个已经说得很明白了吧;累死,打字都打了20分钟;

Ⅲ 改一下单片机控制PWM直流电机的程序

单片机控制PWM直流电机的程序,具体如下:
PWM控制直流电机实现上来说应该不难,最主要是要求:比如加速度,需要多块达到设定速度;
一般来讲有“开环的查表法”和“闭环的采集实时速度法”;
“开环查表”:前提是知道要达到的速度是哪些,然后去增加(或减少)PWM的占空比来看速度是否和设定的一致,然后将此时的占空比放到表格中,下次需要用时,直接根据设定速度查表格就行;这种控制方法适合于“负载”不变的情况,相对简单;
“闭环速度采集”:在硬件电路上要有速度采集系统(霍尔元件),根据反馈的速度大小来调节PWM的占空比,这种方法比较精确,适用于不同的“负载”,在控制速度的过程中要小心“超调”,也就是速度加的太快或者太慢(PWM占空比调节太快),可以通过试验来确定调节的快慢或者引入PID算法
控制电机:要了解可控硅的使用。

例子:
51单片机直流电机的PWM速度控制程序的代码如下:
/* =======直流电机的PWM速度控制程序======== */
/* 晶振采用11.0592M,产生的PWM的频率约为91Hz */
#include<reg51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit en1=P2^0; /* L298的Enable A */
sbit en2=P2^1; /* L298的Enable B */
sbit s1=P2^2; /* L298的Input 1 */
sbit s2=P2^3; /* L298的Input 2 */
sbit s3=P2^4; /* L298的Input 3 */
sbit s4=P2^5; /* L298的Input 4 */
uchar t=0; /* 中断计数器 */
uchar m1=0; /* 电机1速度值 */
uchar m2=0; /* 电机2速度值 */
uchar tmp1,tmp2; /* 电机当前速度值 */

/* 电机控制函数 index-电机号(1,2); speed-电机速度(-100—100) */
void motor(uchar index, char speed)
{
if(speed>=-100 && speed<=100)
{
if(index==1) /* 电机1的处理 */
{
m1=abs(speed); /* 取速度的绝对值 */
if(speed<0) /* 速度值为负则反转 */
{
s1=0;
s2=1;
}
else /* 不为负数则正转 */
{
s1=1;
s2=0;
}
}
if(index==2) /* 电机2的处理 */
{
m2=abs(speed); /* 电机2的速度控制 */
if(speed<0) /* 电机2的方向控制 */
{
s3=0;
s4=1;
}
else
{
s3=1;
s4=0;
}
}
}
}

void delay(uint j) /* 简易延时函数 */
{
for(j;j>0;j--);
}

void main()
{
char i;
TMOD=0x02; /* 设定T0的工作模式为2 */
TH0=0x9B; /* 装入定时器的初值 */
TL0=0x9B;
EA=1; /* 开中断 */
ET0=1; /* 定时器0允许中断 */
TR0=1; /* 启动定时器0 */
while(1) /* 电机实际控制演示 */
{
for(i=0;i<=100;i++) /* 正转加速 */
{
motor(1,i);
motor(2,i);
delay(5000);
}
for(i=100;i>0;i--) /* 正转减速 */
{
motor(1,i);
motor(2,i);
delay(5000);
}
for(i=0;i<=100;i++) /* 反转加速 */
{
motor(1,-i);
motor(2,-i);
delay(5000);
}
for(i=100;i>0;i--) /* 反转减速 */
{
motor(1,-i);
motor(2,-i);
delay(5000);
}
}
}

void timer0() interrupt 1 /* T0中断服务程序 */
{
if(t==0) /* 1个PWM周期完成后才会接受新数值 */
{
tmp1=m1;
tmp2=m2;
}
if(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号 */
if(t<tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号 */
t++;
if(t>=100) t=0; /* 1个PWM信号由100次中断产生 */
}

Ⅳ 我要设计一个用单片机实现PWM的程序,能不能给点设计思路

P0.0置1时间40ms,置0时间60ms,输出200W。
P0.0置1时间60ms,置0时间40ms,输出300W。
P0.0一直置0输出0W。
P0.0状态转换时应检测交流电是否过0。
高级别的单片机本身就有PWM功能,无PWM功能低级别的单片机可用TIMER或自编延时子程序,单片机振荡频率尽量选低频电路更方便编延时子程序。相关单片机厂家网站上都会给出简单应用程序。

Ⅳ 单片机PWM程序是怎么编写的啊,能给一个简单的例子吗

有PWM功能的单片机入STC12系列单片机,直接给专用寄存器赋值开启相应定时器就可以了。普通单单片机,PWM需要用自己来调配。比如:
#include<reg51.h>
unsigned char pwhh,pwhl,pwlh,pwll;
bit flag;
sbit pwm=P1^0;
void t0isr() interrupt 1
{
if(flag)
{
TH0=pwhh;
TL0=pwhl;
}
else
{
TH0=pwlh;
TL0=pwll;
}
pwm=~pwm;
}
main()
{
TMOD=0x01;
pwhh=(65536-1000)/256;
pwhl=(65536-1000)%256;
pwlh=(65536-500)/256;
pwll=(65536-500)%256;
TH0=pwhh;
L0=pwhl;
TR0=1;
ET0=1;
EA=1;
while(1);
}

Ⅵ 利用51单片机定时器产生PWM波的c语言程序,要求如下

#include<reg51.h>
#define uchar unsigned char
uchar pwm=50,cnt;
sbit pluse=P1^0;
sbit keyu=P1^4;
sbit keyd=P1^5;
void t0isr() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
cnt++;
if(pwm>0)
{
if(cnt>100)cnt=0;
if(cnt<=pwm)pluse=1;
else pluse=0;
}
else pluse=0;
}
main()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyu==0)
{
while(keyu==0);
pwm++;
if(pwm>100)pwm=100;
}
if(keyd==0)
{
while(keyd==0);
if(pwm>0)pwm--;
}
}
}

Ⅶ 求51单片机实现PWM的程序

改用AVR单片机吧,是自带的功能,速度是51的10倍以上

Ⅷ 51单片机怎么产生pwm程序

正则表达式替换 import java.util.regex.Matcher; import java.util.regex.Pattern; public class $ { public static void main(String... _) { String sa = "<ABCDEFGHIJK>SDFER<EGD>FG"; Pattern p = Pattern.compile("<([A-Z]|[a-z]){0,}>"); Matcher match = p.matcher(sa); while (match.find()) { String str = match.group(); sa = sa.replaceFirst(str, str.toLowerCase()); } System.out.println(sa); } }

Ⅸ 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的值即可调节占空比,程序框架就是这样,具体自己改吧

阅读全文

与单片机pwm程序相关的资料

热点内容
考驾照怎么找服务器 浏览:882
阿里云服务器如何更换地区 浏览:970
手机app调音器怎么调古筝 浏览:501
锐起无盘系统在服务器上需要设置什么吗 浏览:17
红旗出租车app怎么应聘 浏览:978
如何编写linux程序 浏览:870
吉利车解压 浏览:248
java输入流字符串 浏览:341
安卓软件没网怎么回事 浏览:785
dvd压缩碟怎么导出电脑 浏览:274
冒险岛什么服务器好玩 浏览:541
如何在服务器上做性能测试 浏览:793
命令序列错 浏览:259
javaif的条件表达式 浏览:576
手机app上传的照片怎么找 浏览:531
云服务器面临哪些威胁 浏览:748
c语言各种编译特点 浏览:177
路由器多种加密方法 浏览:604
程序员阻止电脑自动弹出定位 浏览:168
如何做服务器服务商 浏览:763