![]() |
發(fā)布時間: 2018-12-9 22:12
正文摘要:請問單片機(jī)STC15W408AS(類似于51單片機(jī))怎么用PWM實現(xiàn)輸出可調(diào)電壓?C語言程序應(yīng)該怎么寫呢? |
你好 ! 這個程序還有嗎? 能不能分享給我一份,我想具體學(xué)習(xí)一下,非常感謝! |
wulin 發(fā)表于 2018-12-11 08:52 學(xué)習(xí)了,多謝! |
HC6800-ES-V2.0 發(fā)表于 2018-12-10 08:02 請問pwmcr.這幾個大寫英文是pca的命令字么 |
wulin 發(fā)表于 2018-12-10 07:28 求教:num的值開始從1加到255。加了5000次。再讓num的值從255減到1也是5000次。。把num的值賦給計數(shù)器初值。。.那么這個占空比是多少呢。。。沒明白它咋會漸亮 |
嗯嗯。學(xué)到了,非常感謝。 |
wulin 發(fā)表于 2018-12-11 08:52 嗯嗯。學(xué)到了,非常感謝。 |
本帖最后由 wulin 于 2018-12-11 09:00 編輯 summerhqj 發(fā)表于 2018-12-10 22:26 count1,count2是計數(shù)延時變量,延時十幾毫秒num增/減一次,否則不是呼吸燈而是閃爍燈,b=5000也是計數(shù)延時,目的是讓呼吸燈在最亮和最暗時停留幾十毫秒以改善視覺效果。其實把這個子程序略改一下就可以用按鍵控制增減PWM輸出電壓。示例如下: void keyscan() { static uint count1=0,count2=0; if(!key1) { count1++;//消抖計數(shù) if(count1>=2000) { count1=0; if(num>0) { num=num-5;//按5遞減占空比(按實際需求調(diào)整進(jìn)階) CCAP0H=num;//PWM輸出電壓增高 } while(!key1);//松手檢測 } } if(!key2) { count2++; if(count2>=2000) { count2=0; if(num<0xff) { num=num+5;//按5遞增占空比 CCAP0H=num;//PWM輸出電壓降低 } while(!key2); } } } |
HC6800-ES-V2.0 發(fā)表于 2018-12-10 08:02 謝謝! |
wulin 發(fā)表于 2018-12-10 07:28 感謝,請問下這個count1,count2,2000和5000分別是代表什么呢? |
summerhqj 發(fā)表于 2018-12-10 17:23 ![]() |
![]() 感謝,請問下,如果我只用了單片機(jī)的P2.5口來進(jìn)行PWM輸出,它上面寫了CCP0_3,那是不是只要設(shè)置CCP0_3就好了,程序要怎么寫呢?我看了這個程序沒能看出他的PWM輸出口,請教下您,麻煩您了,謝謝! |
因為是第一次接觸這個單片機(jī)的PWM網(wǎng)上找的資料也看不大懂,真的非常感謝各位大佬。 |
這個STC15單片機(jī)的PWM,我做過試驗,部分程序如下(同一程序還有其它功能,暫時不管): //以下內(nèi)容為設(shè)置PWM波的輸出 P_SW2|=0x80; PWMCFG = 0x00; PWMCKS = 0x00; PWMIF=0x00; PWMFDCR=0x00; PWMC = 1001; PWM2T1 = 0; PWM2T2 = 1001; PWMCR=0x81; while(1) { for (i=0;i<1000;i++) { PWM2T1=i; Delay2ms(); } PWMCR=0x00; PWM2T1=1000; Delay1000ms(); PWMCR=0x81; for (i=1000;i>0;i--) { PWM2T1=i;//呼吸燈變亮的過程 Delay2ms(); } } } 我做的設(shè)置,都是參看單片機(jī)手冊得到的。 至于你要求的用PWM輸出一個具體值的電壓,這個我不會!! |
用兩個按鍵操作一個變量num的+-,范圍0x00~0xff,直接控制CCAP0H寄存器:CCAP0H=num; 這是一個PWM呼吸燈程序,把呼吸程序改成按鍵程序即可直接應(yīng)用在PWM調(diào)壓。供你參考。 #include <STC15F2K60S2.H> #define uint unsigned int #define uchar unsigned char //sbit key1=P4^2; //sbit key2=P4^4; sbit LED=P1^0; uchar num=0x00; bit a=0; uint b; void PWM_Init() { CCON = 0; //初始化PCA控制寄存器 //PCA定時器停止 //清除CF標(biāo)志 //清除模塊中斷標(biāo)志 CL = 0; //復(fù)位PCA寄存器 CH = 0; CMOD = 0x02; //設(shè)置PCA時鐘源,PWM頻率=12MHZ/2/256=23.4375KHZ //PWM頻率=11.0592MHZ/2/256=21.600KHZ PCA_PWM0 = 0x00; //PCA模塊0工作于8位PWM CCAP0H = CCAP0L = 0xff; //PWM0的占空比為100% CCAPM0 = 0x42; //PCA模塊0為8位PWM模式 CR = 1; //PCA定時器開始工作 } void scan() { static uint count1=0,count2=0; if(a==0) { count1++; if(count1>=2000) { count1=0; if(num<0xff) { num++; if(num==0xff) { a=1; b=5000; while(b--); } } } } else { count2++; if(count2>=2000) { count2=0; if(num>0) { num--; if(num==0) { a=0; b=5000; while(b--); } } } } } void main() { P1M0 = 0x01; //推挽輸出 P1M1 = 0x00; //推挽輸出 PWM_Init(); while(1) { scan(); CCAP0H=num; } } |
|
Powered by 單片機(jī)教程網(wǎng)