|
| 你好 ! 這個程序還有嗎? 能不能分享給我一份,我想具體學習一下,非常感謝! |
wulin 發表于 2018-12-11 08:52 學習了,多謝! |
HC6800-ES-V2.0 發表于 2018-12-10 08:02 請問pwmcr.這幾個大寫英文是pca的命令字么 |
wulin 發表于 2018-12-10 07:28 求教:num的值開始從1加到255。加了5000次。再讓num的值從255減到1也是5000次。。把num的值賦給計數器初值。。.那么這個占空比是多少呢。。。沒明白它咋會漸亮 |
| 嗯嗯。學到了,非常感謝。 |
wulin 發表于 2018-12-11 08:52 嗯嗯。學到了,非常感謝。 |
本帖最后由 wulin 于 2018-12-11 09:00 編輯 summerhqj 發表于 2018-12-10 22:26 count1,count2是計數延時變量,延時十幾毫秒num增/減一次,否則不是呼吸燈而是閃爍燈,b=5000也是計數延時,目的是讓呼吸燈在最亮和最暗時停留幾十毫秒以改善視覺效果。其實把這個子程序略改一下就可以用按鍵控制增減PWM輸出電壓。示例如下: void keyscan() { static uint count1=0,count2=0; if(!key1) { count1++;//消抖計數 if(count1>=2000) { count1=0; if(num>0) { num=num-5;//按5遞減占空比(按實際需求調整進階) 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 發表于 2018-12-10 08:02 謝謝! |
wulin 發表于 2018-12-10 07:28 感謝,請問下這個count1,count2,2000和5000分別是代表什么呢? |
summerhqj 發表于 2018-12-10 17:23
|
|
感謝,請問下,如果我只用了單片機的P2.5口來進行PWM輸出,它上面寫了CCP0_3,那是不是只要設置CCP0_3就好了,程序要怎么寫呢?我看了這個程序沒能看出他的PWM輸出口,請教下您,麻煩您了,謝謝! |
| 因為是第一次接觸這個單片機的PWM網上找的資料也看不大懂,真的非常感謝各位大佬。 |
|
這個STC15單片機的PWM,我做過試驗,部分程序如下(同一程序還有其它功能,暫時不管): //以下內容為設置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(); } } } 我做的設置,都是參看單片機手冊得到的。 至于你要求的用PWM輸出一個具體值的電壓,這個我不會!!! |
|
用兩個按鍵操作一個變量num的+-,范圍0x00~0xff,直接控制CCAP0H寄存器:CCAP0H=num; 這是一個PWM呼吸燈程序,把呼吸程序改成按鍵程序即可直接應用在PWM調壓。供你參考。 #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標志 //清除模塊中斷標志 CL = 0; //復位PCA寄存器 CH = 0; CMOD = 0x02; //設置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; } } |
|