Ⅰ 單片機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的值即可調節占空比,程序框架就是這樣,具體自己改吧