1. stc12c5a60s2單片機pwm占空比控制寄存器怎麼調
CCAP0H=0x80; // 占空比控制,數字范圍0-255,數字越大,占空比越小,
CCAP0L=0x80; // 自動重裝,所以CCAP0H,CCAP0L相等
PCA_PWM0=0x00; //stc12c5a60s2是8位PWM,控制占空比的第九位為0
2. 怎麼用stc12c5a60s2單片機寫PWM的程序,哪位大俠提供詳細常式的
#include <REG51.H>
#include <intrins.h>
#define U8 unsigned char
#define U16 unsigned int
void DelayMs(U8 ms);
void PWM_clock(U8 clock);
void PWM_start(U8 mole,U8 mode);
////////////////////// 延時子程序/////////////////////////////
void DelayMs(U8 ms) //在11.0592M晶振下,stc10f系列(單周期指令)的ms級延時
{
U16 i;
while(ms--)
{
for(i = 0; i < 850; i++);
}
}
////////////////////主函數入口////////////////////////////
sfr CCON = 0xD8; //PCA控制寄存器
sfr CMOD = 0xD9; //PCA模式寄存器
sfr CCAPM0 = 0xDA; //PCA模塊0模式寄存器 //模塊0對應P1.3/CEX0/PCA0/PWM0(STC12C5A60S2系列)
sfr CCAPM1 = 0xDB; //PCA模塊1模式寄存器 //模塊1對應P1.4/CEX1/PCA1/PWM1(STC12C5A60S2系列)
sfr CL = 0xE9; //PCA 定時寄存器 低位
sfr CH = 0xF9; //PCA 定時寄存器 高位
sfr CCAP0L = 0xEA; //PCA模塊0的 捕獲寄存器 低位
sfr CCAP0H = 0xFA; //PCA模塊0的 捕獲寄存器 高位
sfr CCAP1L = 0xEB; //PCA模塊1的 捕獲寄存器 低位
sfr CCAP1H = 0xFB; //PCA模塊1的 捕獲寄存器 高位
sfr PCA_PWM0 = 0xF2; //PCA PWM 模式輔助寄存器0
sfr PCA_PWM1 = 0xF3; //PCA PWM 模式輔助寄存器1
sbit CF = 0xDF; //PCA計數溢出標志位
sbit CR = 0xDE; //PCA計數器 運行控制位
sbit CCF1 = 0xD9; //PCA模塊1中斷標志
sbit CCF0 = 0xD8; //PCA模塊0中斷標志
//* CCAPOH = CCAPOL = 0XC0; //模塊0輸出 占空因數為25%
//* CCAPOH = CCAPOL = 0X80; //模塊0輸出 占空因數為50%
//* CCAPOH = CCAPOL = 0X40; //模塊0輸出 占空因數為75%
void PWM_clock(U8 clock);
void PWM_start(U8 mole,U8 mode);
void PWM_clock(U8 clock)
{
CMOD |= (clock<<1);
CL = 0x00;
CH = 0x00;
}
void PWM_start(U8 mole,U8 mode)
{
CCAP0L = 0XE0;
CCAP0H = 0XE0; //模塊0初始輸出 占空因數為75%
CCAP1L = 0XE4;
CCAP1H = 0XE4; //模塊1初始輸出 占空因數為25%
if(mole==0)
{
switch(mode)
{
case 0: CCAPM0 = 0X42;break; //模塊0設置為8位PWM輸出,無中斷
case 1: CCAPM0 = 0X53;break; //模塊0設置為8位PWM輸出,下降沿產生中斷
case 2: CCAPM0 = 0X63;break; //模塊0設置為8位PWM輸出,上升沿產生中斷
case 3: CCAPM0 = 0X73;break; //模塊0設置為8位PWM輸出,跳變沿產生中斷
default: break;
}
}
else
if(mole==1)
{
switch(mode)
{
case 0: CCAPM1 = 0X42;break; //模塊1設置為8位PWM輸出,無中斷
case 1: CCAPM1 = 0X53;break; //模塊1設置為8位PWM輸出,下降沿產生中斷
case 2: CCAPM1 = 0X63;break; //模塊1設置為8位PWM輸出,上升沿產生中斷
case 3: CCAPM1 = 0X73;break; //模塊1設置為8位PWM輸出,跳變沿產生中斷
default: break;
}
}
else
if(mole==2)
{
switch(mode)
{
case 0: CCAPM0 = CCAPM1 = 0X42;break; //模塊0和1設置為8位PWM輸出,無中斷
case 1: CCAPM0 = CCAPM1 = 0X53;break; //模塊0和1設置為8位PWM輸出,下降沿產生中斷
case 2: CCAPM0 = CCAPM1 = 0X63;break; //模塊0和1設置為8位PWM輸出,上升沿產生中斷
case 3: CCAPM0 = CCAPM1 = 0X73;break; //模塊0和1設置為8位PWM輸出,跳變沿產生中斷
default: break;
}
}
CR=1; //PCA計數器開始計數
}
void PCA_Intrrpt(void) interrupt 7
{
if(CCF0) CCF0=0;
if(CCF1) CCF1=0; //軟體清零
if(CF) CF=0; //軟體清零
}
void main()
{
TMOD|=0x02; /* timer 0 mode 2: 8-Bit reload */
TH0=0xAF;
TR0=1;
PWM_clock(2); // PCA/PWM時鍾源為 定時器0的溢出
PWM_start(0,0); // 模塊0,設置為PWM輸出,無中斷,初始占空因素為25%
while(1)
{
DelayMs(250);
}
}
3. 跪求stc12c5a60s2單片機PWM程序。50%占空比。P1.3口輸出PWM。
#include<STC12C5A60S2.H> //頭文件
/*********************************************************************************************
函數名:PWM初始化函數
調 用:PWM_init();
參 數:無
返回值:無
結 果:將PCA初始化為PWM模式,初始占空比為0
備 註:需要更多路PWM輸出直接插入CCAPnH和CCAPnL即可
/**********************************************************************************************/
void PWM_init (void){
CMOD=0x02; //設置PCA定時器
CL=0x00;
CH=0x00;
CCAPM0=0x42; //PWM0設置PCA工作方式為PWM方式(0100 0010)
CCAP0L=0x00; //設置PWM0初始值與CCAP0H相同
CCAP0H=0x00; // PWM0初始時為0
//CCAPM1=0x42; //PWM1設置PCA工作方式為PWM方式(使用時刪除//)
//CCAP1L=0x00; //設置PWM1初始值與CCAP0H相同
//CCAP1H=0x00; // PWM1初始時為0
//CCAPM2=0x42; //PWM2設置PCA工作方式為PWM方式
//CCAP2L=0x00; //設置PWM2初始值與CCAP0H相同
//CCAP2H=0x00; // PWM2初始時為0
//CCAPM3=0x42; //PWM3設置PCA工作方式為PWM方式
//CCAP3L=0x00; //設置PWM3初始值與CCAP0H相同
//CCAP3H=0x00; // PWM3初始時為0
CR=1; //啟動PCA定時器
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:PWM0占空比設置函數
調 用:PWM0_set();
參 數:0x00~0xFF(亦可用0~255)
返回值:無
結 果:設置PWM模式占空比,為0時全部高電平,為1時全部低電平
備 註:如果需要PWM1的設置函數,只要把CCAP0L和CCAP0H中的0改為1即可
/**********************************************************************************************/
void PWM0_set (unsigned char a){
CCAP0L= a; //設置值直接寫入CCAP0L
CCAP0H= a; //設置值直接寫入CCAP0H
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:主函數
調 用:無
參 數:無
返回值:無
結 果:程序開始處,無限循環
備 註:
/**********************************************************************************************/
void main (void){
while(1){
PWM_init(); //PWM初始化
PWM0_set(0x7F); //設置PWM占空比,總共255,除以2,轉換成十六進製得7F
}
}
/**********************************************************************************************/
4. stc12c5A60s2單片機pwm輸出怎麼寫,兩路的 CCAPM0=0x42這是P1.3口的,
P1.4是模塊1來控制的,初始化後給CCAPM1賦值就可以。
5. STC12C5A60S2單片機怎麼才能輸出占空比可調的PWM
void PWM_init (void){//PWM初始化函數
CMOD=0x02; //設置PCA定時器,計數頻率為晶振頻率/2 當為12Mhz時,PWM輸出頻率約23.4Khz
//CMOD=0x00; //設置PCA定時器,計數頻率為晶振頻率/12 當為12Mhz時,PWM輸出頻率約3.9Khz
//CMOD=0x04; //設置PCA定時器,計數頻率為定時器0的溢出率,晶振頻率/256 當為12Mhz時,PWM輸出頻率約183hz
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM1設置PCA工作方式為PWM方式(0100 0010)
CCAP1L=0x00; //設置PWM1初始值與CCAP0H相同
CCAP1H=0x00; // PWM1初始時為0
CR=1; //啟動PCA定時器
}
void PWM1_set (uchar a)//PWM1占空比設置函數
{
CCAP1L=a; //設置值直接寫入CCAP1L
CCAP1H=a; //設置值直接寫入CCAP1H
}
主程序中,按預想規律改變PWM1_set (uchar a)的參數即可調節占空比
6. 跪求 STC12C5A60S2單片機內部PWM 程序
void pwm_init(void) //PWM初始化函數,初始占空比為0
{
CMOD=0x02; //0000 0010 空閑時不計數,不產生中斷,時鍾源為fosc/2,因此輸出佔用率為fosc/512
CL=0x00;
CH=0x00;
CCAPM0=0x42; //0100 0010, 8位 PWM
CCAP0L=0x00;
CCAP0H=0x00; //PWM實現方法,因為是8位,CL基礎計數器從0xFF遞減到0x00,溢出後將CCAP0H
//的值載入到CCAP0L,若CL遞減過程中,若大於CCAP0L,則輸出高電平,否則為低電平
CCAPM1=0x42;
CCAP1H=0x00;
CCAP1L=0x00;
CR=1; //開啟PCA計數器
}
/*********************************************************************************************/
void pwm_set(uchar x,uchar y) //占空比設置函數
{
CCAP0H=x; //設置比較值
CCAP0L=x;
CCAP1H=y;
CCAP1L=y;
}
x用於設置P1.3的占空比,數值越大占空比越小
y用於設置P1.4的占空比,數值越大占空比越小
7. STC12C5A60S2 單片機PWM輸出問題
PWM信號是占空比可調的,這種問題很少,用L298N驅動電機的話一般情況兩個輪子轉速還是不會有差別的。
要麼你就修改
CCON = 0; //Initial PCA control register(PCA timer stop,Clear CF flag,Clear all mole interrupt flag)
CL = 0; //Reset PCA base timer
CH = 0;
CMOD = 0x04; //Set PCA timer clock source as timer0 overflow,Disable PCA timer overflow interrupt
CCAP0H = CCAP0L = 255; //PWM0 port output X% ty cycle square wave
CCAPM0 = 0x42; //PCA mole-0 work in 8-bit PWM mode and no PCA interrupt
CCAP1H = CCAP1L = 255; //PWM1 port output X% ty cycle square wave
CCAPM1 = 0x42; //PCA mole-1 work in 8-bit PWM mode and no PCA interrupt
CR = 1;
只要CCAPxH相同就可以正常工作。
誤差很小的,也有可能是你負載的問題。