當前位置:首頁 » 編程語言 » 用c語言編譯pwm波
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

用c語言編譯pwm波

發布時間: 2022-07-05 04:59:20

『壹』 CCS軟體c語言編程輸出SPWM脈寬調制波控制感應電機轉速程序演算法解讀

1、PWM波是控制直流電機的
通俗的說,5V直流電機在5V的情況下肯定速度最快,在0V的情況下肯定不轉了
這樣電源0~5V就對應了不同的速度
問題是怎麼才能實現0~5V的變化呢?
於是就用PWM波控制mos管來給直流電機供電。PWM就是一個矩形波,通過控制高電平和低電平的時間來控制MOS管導通的時間。MOS管在高電平的時候導通,就相當於5V電源直接加到電機上;MOS管在低電平的時候截止,就相當於0V電源加到電機上。
PWM又叫脈寬調制,就是控制高電平佔一個周期的比例。而這個PWM波就是控制5V電源加到電機上的時間,從而控制了電機。

2、常式:
#include <reg52.h>
sbit KEY1 = P3^4;
sbit PWM = P1^5;
unsigned char CYCLE; //定義周期 該數字X基準定時時間 如果是10 則周期是10 x 0.1ms
unsigned char PWM_ON ;//定義高電平時間
void delay(unsigned int cnt)
{
while(--cnt);
}

main()
{
unsigned char PWM_Num;//定義檔位
TMOD |=0x01;//定時器設置 1ms in 12M crystal
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//定時1mS
IE= 0x82; //打開中斷
TR0=1;

CYCLE = 10;// 時間可以調整 這個是10步調整 周期10ms 8位PWM就是256步
while(1)
{
if(!KEY1)
{
delay(10000);
if(!KEY1)
{
PWM_Num++;
if(PWM_Num==4)PWM_Num=0;
switch(PWM_Num){
case 0:P0=0x06;PWM_ON=0;break;//高電平時長
case 1:P0=0x5B;PWM_ON=4;break;
case 2:P0=0x4F;PWM_ON=6;break;
case 3:P0=0x66;PWM_ON=8;break;
default:break;
}
}

}
}

}
/********************************/
/* 定時中斷 */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;//定時1mS

if (count==PWM_ON)
{
PWM = 1; //燈滅
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //如果左右時間是0 保持原來狀態
PWM = 0;//燈亮

}

『貳』 AT89C51單片機P1.0口產生PWM波的C語言程序怎麼編寫求大神(不要太復雜啊)

根據你自己的需要,PWM分級,PWM周期10ms,分100級,那麼定時器中斷100us,另外一個寄存器中斷里計數,和你要的占空比寄存器比較,如果當前占空比50%,那麼計數器比較是否大於5ms,大於則PWMP1.0輸出高,小於則PWMP1.0輸出低,最後判斷計數是否到10ms,然後清零,從新開始!就可以了啊,很簡單,如需改變占空比那麼在一個PWM周期完成後改變即可,如果是調速,那麼直接增加或者減少佔空比,不需要等下個周期

『叄』 利用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系列C語言怎樣產生可調占空比的pwm波

不知道你在匯編中用的什麼辦法,用的是定時器嗎。在C語言中也用定時器。定義好定時器,定義一個unsigned char 變數,在定時器函數中自加。不用做任何處理加到255再加會自動回0.然後判斷這個數如果小於多少出0,大於多少出1.就可以了。

『伍』 單片機C語言PWM的典型程序謝謝

/ 利用定時器控制產生占空比可變的 PWM 波
// 按K1,PWM值增加,則占空比減小,電機減速。
// 按K2,PWM值減小,則占空比增加,電機加速。
// 當PWM值增加到最大值或減小到最小值時,蜂鳴器將報警。

/*********************************************************/

#include<reg51.h>
#include<intrins.h>

sbit K1 =P1^4 ; //PWM值增加鍵
sbit K2 =P1^5 ; //PWM值減少鍵
sbit BEEP =P3^7 ; //蜂鳴器
unsigned char PWM=0x7f ; //賦初值

void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);

/*********************************************************/
void main()
{
P1=0xff;
TMOD=0x21 ;
TH0=0xfc ; //1ms延時常數
TL0=0x66 ; //頻率調節

TH1=PWM ; //脈寬調節
TL1=0 ;

EA=1;
ET0=1;
ET1=1;

TR0=1 ;

while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(K1==0);

do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(K2==0);
}
}

/*********************************************************/
// 定時器0中斷服務程序 (頻率)
/*********************************************************/
void timer0() interrupt 1
{
TR1=0 ;
TH0=0xfc ;
TL0=0x66 ;
TH1=PWM ;
TR1=1 ;
P0=0x00 ; //啟動輸出
}

/*********************************************************/
// 定時器1中斷服務程序 (脈寬)
/*********************************************************/
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //結束輸出
}

/*********************************************************/
//蜂鳴器子程序
/*********************************************************/

void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //關閉蜂鳴器
delayms(100);
}

/*********************************************************/
// 延時子程序
/*********************************************************/
void delay(unsigned char t)
{
while(t--) ;
}

/*********************************************************/
// 延時子程序
/*********************************************************/
void delayms(unsigned char ms)

{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}

/*********************************************************/

『陸』 求c語言程序控制小車

首先需要控制器(單片機)用c編譯pwm波輸出程序(通過控制周期來控制轉速)+後面的相應硬體。大致過程就是這樣了,給分吧

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

『捌』 C8051的C語言編程產生占空比可調的PWM波

viod function(PORT,PWM)
{
int i=0;
while(1)
{
i++;
if(i<PWM)
{PORT=1;
}
if(PWM<i<100)
{PORT=0;
}
if(i=100)
{i=0;
}
}
子程序,初始化什麼的,自己參照教程加進去,在main()函數里調用這個子程序,通過改變PWM,和100的值可以改變PWM頻率

『玖』 PIC單片機輸出PWM波的C語言源程序

#ifndef __PWM__H__
#define __PWM__H__
void pwm_ccp1(unsigned char a,unsigned char b);
void pwm_ccp2(unsigned char a,unsigned char b);
#endif

void pwm_ccp1(unsigned char a,unsigned char b) //左邊PWM
//CCP1 模塊的 PWM 工作方式,周期為(b+1)*4*Tosc*(TMR2前分頻值)=b+1 us //pwm高電平=a:CCP1CON(第四五位)Tosc*(TMR2前分頻值)
//pwm高電平=a:CCP1CON(第四五位)Tosc*(TMR2前分頻值)
{ //a>b時有最高轉速
CCPR1L=a; //* 設置工作循環的高 8bit 為 a
CCP1CON=0X0C; //0000 1100 設置 CCP1 為 PWM 工作方式,且工作循環的低 bit2 為 11*/
CCP1IE=0;; //* 禁止總中斷和外圍中斷 */
PR2=b; //* 設置 PWM 周期 */
TRISC2=0; //* 設置 RC2/CCP1 為輸出 */
T2CON=0X04; //* 0000 1000前分頻比為 1:1 ,後分頻器1:2,打開 TMR2 ,同時輸出 PWM 信號 */
}

void pwm_ccp2(unsigned char a,unsigned char b) //右邊PWM
//CCP2 模塊的 PWM 工作方式,周期為(b+1)*4*Tosc*(TMR2前分頻值),
//pwm高電平=a:CCP2CON(第四五位)Tosc*(TMR2前分頻值)
{
CCPR2L=a; //* 設置工作循環的高 8bit 為 a
CCP2CON=0X0C; //* 設置 CCP2 為 PWM 工作方式,且工作循環的低 bit2 為 11*/
CCP2IE=0; //* 中斷屏蔽
PR2=b; //* 設置 PWM 周期 */
TRISC1=0; //* 設置 RC1/CCP2 為輸出 */
T2CON=0X04; //* 前分頻比為 1 ,打開 TMR2 ,同時輸出 PWM 信號 */
}

『拾』 我想問一下~那個~用STC89C52單片機產生一個PWM波的C語言程序怎麼寫啊

首先89C52內部沒有硬體PWM發生器,只能通過定時器模擬!你可以通過兩個定時器,T0控制周期,T1控制占空比。
例如:實現周期為1000us,占空比為20%的PWM,用P1.0實現
首先你設置T0為65536-1000 (12M晶振)
T1為65536-200
首先初始化P1.0=1,兩個定時器同時打開,在定時器T1中斷時拉低P1.0,在定時器T0中斷時在拉高P1.0,同時將兩定時器初始值初始化T0為65536-1000 ,T1為65536-200
希望對你有用,呵呵!!!