找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 19915|回復(fù): 37
收起左側(cè)

關(guān)于STC8G單片機(jī)的PCA_10PWM輸出注意事項(xiàng)

  [復(fù)制鏈接]
ID:554500 發(fā)表于 2021-5-9 01:43 | 顯示全部樓層 |閱讀模式
51hei截圖20210509003750.png

以前用過(guò)STC15W的8位PWM,配置很簡(jiǎn)單。
數(shù)據(jù)手冊(cè)上也有參考代碼。
一直渴望STC能出8個(gè)腳帶AD的單片機(jī),終于等到了,去年STC8G系列上市。這款芯片帶10位ADC,6/7/8/10位硬件PWM等待。價(jià)格0.8元左右。
這幾天公司接了個(gè)電位器調(diào)光的項(xiàng)目,這讓我想到了STC8G1K08A單片機(jī),自帶的功能剛才滿足產(chǎn)品要求。
說(shuō)實(shí)在的,真心不敢用。畢竟是新品,也不知道質(zhì)量咋樣?抱著支持國(guó)產(chǎn)芯片的想法,決定試試。
說(shuō)干就干,于是在某一個(gè)寶上買了幾片。這個(gè)調(diào)光產(chǎn)品主要用到ADC和PWM。
測(cè)試ADC,沒(méi)問(wèn)題!
測(cè)試8位PWM,沒(méi)問(wèn)題。ㄒ郧巴孢^(guò)15系列的,代碼基本相同)
想著有10位的PWM干嘛要用8位的呢?決定用10位的PWM.
結(jié)果搞了一天,愣是沒(méi)搞出來(lái)。有波形輸出,但是不是自己想要的波形。半夜了,睡覺(jué)吧。。。!

這里說(shuō)明下關(guān)于PWM寄存器:
1.png 2.png 3.png

10位PWM重裝值和比較值的高2位和低8位在兩個(gè)寄存器,PCA_PWMn和CCAPnH。
以前寫代碼習(xí)慣了根據(jù)數(shù)據(jù)手冊(cè)的寄存器從上往下配置,特殊寄存器除外。
以前配置8位PWM初始化代碼如下:
//8位PWM_PCA初始化
void PCA_Init()
{
        CCON=0x00;  //關(guān)閉PCA計(jì)數(shù)器,清除相關(guān)標(biāo)志位
        CMOD=PCA_SYSCLK2;  //PCA時(shí)鐘源為系統(tǒng)時(shí)鐘2分頻  33.1776/2/1024=0.0162MHZ ==>16.2KHZ
        CL  =0x00;  //計(jì)數(shù)器清零
        CH  =0x00;
/*------------------------PWM0部分-----------------------------*/
        CCAPM0=0x42; //使能PCA模塊0_PWM輸出
        CCAP0L=0X00;    //捕獲比較寄存器低8位,比較值
        CCAP0H=0X00;    //捕獲比較寄存器高8位,重裝值
        PCA_PWM0=0x00;  //8位PWM輸出        
/*------------------------PWM1部分-----------------------------*/
        CCAPM1=0x42; //使能PCA模塊0_PWM輸出
        CCAP1L=0X00;    //捕獲比較寄存器低8位,比較值
        CCAP1H=0X00;    //捕獲比較寄存器高8位,重裝值
        PCA_PWM1=0x00; //8位PWM輸出

        CCON|=  1<<6;   //啟動(dòng)計(jì)數(shù)器
}


這樣,調(diào)節(jié)自己想要的占空比就OK了,8位PWM正常使用。所以,覺(jué)得修改PWM位數(shù)就行了。
于是,10位PWM配置如下:
//10位PWM_PCA初始化
//用電位器調(diào)節(jié)占空比
void PCA_Init()
{
        CCON=0x00;  //關(guān)閉PCA計(jì)數(shù)器,清除相關(guān)標(biāo)志位
        CMOD=PCA_SYSCLK2;  //PCA時(shí)鐘源為系統(tǒng)時(shí)鐘2分頻  33.1776/2/1024=0.0162MHZ ==>16.2KHZ
        CL  =0x00;  //計(jì)數(shù)器清零
        CH  =0x00;
/*------------------------PWM0部分-----------------------------*/
        CCAPM0=0x42; //使能PCA模塊0_PWM輸出
        CCAP0L=0X00;    //捕獲比較寄存器低8位,比較值
        CCAP0H=0X00;    //捕獲比較寄存器高8位,重裝值
        PCA_PWM0=0xC0;  //10位PWM輸出        
/*------------------------PWM1部分-----------------------------*/
        CCAPM1=0x42; //使能PCA模塊0_PWM輸出
        CCAP1L=0X00;    //捕獲比較寄存器低8位,比較值
        CCAP1H=0X00;    //捕獲比較寄存器高8位,重裝值
        PCA_PWM1=0xC0; //10位PWM輸出

        CCON|=  1<<6;   //啟動(dòng)計(jì)數(shù)器
}


調(diào)節(jié)占空比的時(shí)候用示波器觀察波形,發(fā)現(xiàn)波形不對(duì),波形的確是10位的,這點(diǎn)可以肯定。數(shù)據(jù)手冊(cè)看了一遍又一遍,覺(jué)得代碼沒(méi)問(wèn)題啊。
實(shí)在沒(méi)辦法了。后來(lái)添加了串口功能,決定把相關(guān)寄存器通過(guò)串口發(fā)出來(lái)看看。
通過(guò)觀察發(fā)現(xiàn),PWM重裝值高2位永遠(yuǎn)是00,低8位沒(méi)問(wèn)題,調(diào)節(jié)占空比的代碼如下:
//設(shè)置脈沖寬度
void PWM0_Set_Duty(u16 Duty)
{
        //注意:在更新 10 位 PWM 的重載值時(shí),必須先寫高兩位 XCCAPnH[1:0],再寫低 8 位 CCAPnH[7:0]。
        PCA_PWM0&= ~(3<<4);        //清零重裝值高2位
        PCA_PWM0|= (Duty>>4)&0x30; //設(shè)置新的重裝值高2位
        CCAP0H   = Duty;           //重裝值低8位
}
這樣寫應(yīng)該沒(méi)錯(cuò)啊,咋回事呢?
于是在main函數(shù)里測(cè)試下:
void main()
{
        u8 st;
        
        P_SW2|=0x80; //可以訪問(wèn)擴(kuò)展的RAM        
        UART1_Init();        
        ADC_Init();
        PCA_Init();
        Timer0_Init();
        SCH_Task_Init();
        
        st=SCH_Task_Add(PWM_Out,30,30,0,ENABLE);        
        Timer0_Cmd(ENABLE);
        
        PCA_PWM0=0xFF;
        UART1_SendByte(PCA_PWM0);
        while(1)
        {
                SCH_Task_Dispatch();
        }
}


結(jié)果發(fā)現(xiàn),串口發(fā)出來(lái)的是0xCF。明明賦值0xFF,為啥讀出來(lái)的卻是0xCF呢?明擺著那兩個(gè)位沒(méi)寫進(jìn)去。奇怪了。!
于是我把//PCA_Init();初始化函數(shù)注釋掉.再來(lái)測(cè)試下,給PCA_PWM0寄存器賦值0xFF,讀出來(lái)是0xFF。可以寫進(jìn)去了。
這就證明問(wèn)題出在PCA_Init();初始化函數(shù);仡^看看初始化函數(shù).....................省略繁瑣的過(guò)程............................!
最后發(fā)現(xiàn)是CCAPM0寄存器的問(wèn)題,這個(gè)寄存器我用到了,允許比較功能和使能PWM 輸出。
問(wèn)題就出在使能PWM輸出這個(gè)位上。使能了PWM輸出,Pwm重裝值高2位就寫不進(jìn)去,也就沒(méi)辦法調(diào)節(jié)占空比。
4.png

這和資料上的最后一句話是不是沖突了。這算不算一個(gè)BUG呢。
在修改重裝值前,先禁止PWM 輸出,修改好后再打開(kāi)。這能算無(wú)干擾嗎???


最后代碼修改如下:
//10位PWMPCA初始化
void PCA_Init()
{
        CCON=0x00;  //關(guān)閉PCA計(jì)數(shù)器,清除相關(guān)標(biāo)志位
        CMOD=PCA_SYSCLK2;  //PCA時(shí)鐘源為系統(tǒng)時(shí)鐘2分頻  33.1776/2/1024=0.0162MHZ ==>16.2KHZ
        CL  =0x00;  //計(jì)數(shù)器清零
        CH  =0x00;
/*------------------------PWM0部分-----------------------------*/
        CCAPM0 = 0x40;  //失能PCA模塊0_PWM輸出
        CCAP0L=0X00;    //捕獲比較寄存器低8位,比較值
        CCAP0H=0X00;    //捕獲比較寄存器高8位,重裝值
        PCA_PWM0=0xC0;  //10位PWM輸出
        CCAPM0=0x42; //使能PCA模塊0_PWM輸出
        
/*------------------------PWM1部分-----------------------------*/
        CCAPM1 = 0x40;  //失能PCA模塊1_PWM輸出
        CCAP1L=0X00;    //捕獲比較寄存器低8位,比較值
        CCAP1H=0X00;    //捕獲比較寄存器高8位,重裝值
        PCA_PWM1=0xC0; //10位PWM輸出
        CCAPM1=0x42; //使能PCA模塊0_PWM輸出
        
        CCON|=  1<<6;   //啟動(dòng)計(jì)數(shù)器
}


//設(shè)置脈沖寬度
void PWM0_Set_Duty(u16 Duty)
{
        //注意:在更新 10 位 PWM 的重載值時(shí),必須先寫高兩位 XCCAPnH[1:0],再寫低 8 位 CCAPnH[7:0]。
        
        CCAPM0   = 0x40;           //失能PCA模塊0_PWM輸出
        PCA_PWM0&= ~(3<<4);        //清零重裝值高2位
        PCA_PWM0|= (Duty>>4)&0x30; //設(shè)置新的重裝值高2位
        CCAP0H   = Duty;           //重裝值低8位
        CCAPM0   = 0x42;           //使能PCA模塊0_PWM輸出
}


//設(shè)置脈沖寬度
void PWM1_Set_Duty(u16 Duty)
{
        //注意:在更新 10 位 PWM 的重載值時(shí),必須先寫高兩位 XCCAPnH[1:0],再寫低 8 位 CCAPnH[7:0]。
        
        CCAPM1   = 0x40;           //失能PCA模塊1_PWM輸出
        PCA_PWM1&= ~(3<<4);        //清零重裝值高2位
        PCA_PWM1|= (Duty>>4)&0x30; //設(shè)置新的重裝值高2位
        CCAP1H   = Duty;           //重裝值低8位
        CCAPM1   = 0x42;           //使能PCA模塊0_PWM輸出
}


以上是個(gè)人見(jiàn)解,如有說(shuō)錯(cuò)的,請(qǐng)大家指出,我會(huì)虛心求教!!
















評(píng)分

參與人數(shù) 4黑幣 +130 收起 理由
wpppmlah + 15 贊一個(gè)!
MOVEORDIE + 10 感謝分享
絲瓜 + 5 感謝踩坑!
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:359272 發(fā)表于 2021-5-18 17:16 | 顯示全部樓層
非常感謝樓主的調(diào)試過(guò)程分享,正準(zhǔn)備上手研究下。
回復(fù)

使用道具 舉報(bào)

ID:807182 發(fā)表于 2021-5-24 16:41 | 顯示全部樓層
大佬,我想請(qǐng)教一下,我直接用這個(gè)給的官方例程移植過(guò)來(lái),PWM就是沒(méi)有輸出?可以幫忙看一下嗎?
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-5-24 21:08 | 顯示全部樓層
暖西夏 發(fā)表于 2021-5-24 16:41
大佬,我想請(qǐng)教一下,我直接用這個(gè)給的官方例程移植過(guò)來(lái),PWM就是沒(méi)有輸出?可以幫忙看一下嗎?

代碼貼出來(lái)大家一起討論,共師兄習(xí)。!
回復(fù)

使用道具 舉報(bào)

ID:884843 發(fā)表于 2021-5-25 12:17 | 顯示全部樓層
感謝分享調(diào)試心得
回復(fù)

使用道具 舉報(bào)

ID:390307 發(fā)表于 2021-5-26 23:57 | 顯示全部樓層
昨天正好也發(fā)現(xiàn)這個(gè)問(wèn)題,感謝樓主踩坑分享
回復(fù)

使用道具 舉報(bào)

ID:332838 發(fā)表于 2021-6-17 16:41 | 顯示全部樓層
33.1776/2/1024=0.0162MHZ ==>16.2KHZ
請(qǐng)問(wèn)一下,這里為什么要除以1024?
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-6-18 09:25 | 顯示全部樓層
yonnhor 發(fā)表于 2021-6-17 16:41
33.1776/2/1024=0.0162MHZ ==>16.2KHZ
請(qǐng)問(wèn)一下,這里為什么要除以1024?

因?yàn)镻WM是10位的
回復(fù)

使用道具 舉報(bào)

ID:272119 發(fā)表于 2021-6-18 14:38 | 顯示全部樓層
STC8G1K08A 現(xiàn)在某一個(gè)寶行價(jià)5元以上吧,真心無(wú)法理解,1元不到的報(bào)價(jià)現(xiàn)在都5元過(guò)頭,還怎么搞小項(xiàng)目開(kāi)發(fā)STC怎么用國(guó)產(chǎn)占領(lǐng)市場(chǎng)......
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-6-18 15:06 | 顯示全部樓層
qq603599910 發(fā)表于 2021-6-18 14:38
STC8G1K08A 現(xiàn)在某一個(gè)寶行價(jià)5元以上吧,真心無(wú)法理解,1元不到的報(bào)價(jià)現(xiàn)在都5元過(guò)頭,還怎么搞小項(xiàng)目開(kāi)發(fā)STC怎 ...

關(guān)鍵是有價(jià)無(wú)市,根本拿不到貨。
去年stc8h1k17 ssop20 含稅價(jià)1.35元
上個(gè)月從stc代理那里拿貨,單價(jià)6元,拿了3萬(wàn)個(gè),花了我18萬(wàn)。
心在滴血啊。沒(méi)辦法,產(chǎn)品還得做。少賺點(diǎn)就少賺點(diǎn)。
回復(fù)

使用道具 舉報(bào)

ID:155507 發(fā)表于 2021-6-26 12:24 | 顯示全部樓層
18701931930 發(fā)表于 2021-6-18 15:06
關(guān)鍵是有價(jià)無(wú)市,根本拿不到貨。
去年stc8h1k17 ssop20 含稅價(jià)1.35元
上個(gè)月從stc代理那里拿貨,單價(jià)6 ...

某一個(gè)寶上的價(jià)格高一點(diǎn),自己玩玩研究無(wú)所謂,量大還是要聯(lián)系原廠訂購(gòu)。
回復(fù)

使用道具 舉報(bào)

ID:927469 發(fā)表于 2021-6-29 23:04 | 顯示全部樓層
樓主這個(gè)電路圖能看看嗎
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-6-30 08:36 | 顯示全部樓層
kmikmi 發(fā)表于 2021-6-29 23:04
樓主這個(gè)電路圖能看看嗎

51hei截圖20210630083443.jpg
單片機(jī):STC8G1K08A
PWM輸出連接 P3.2-P3.3
回復(fù)

使用道具 舉報(bào)

ID:893179 發(fā)表于 2021-7-10 18:25 | 顯示全部樓層
“//用電位器調(diào)節(jié)占空比”    ————    怎么用電位器調(diào)節(jié)占空比了?
回復(fù)

使用道具 舉報(bào)

ID:554500 發(fā)表于 2021-7-11 16:08 | 顯示全部樓層
420793043 發(fā)表于 2021-7-10 18:25
“//用電位器調(diào)節(jié)占空比”    ————    怎么用電位器調(diào)節(jié)占空比了?

電位器調(diào)節(jié)就用AD轉(zhuǎn)換,模擬量對(duì)應(yīng)想要的占空比
回復(fù)

使用道具 舉報(bào)

ID:120977 發(fā)表于 2021-8-6 10:47 來(lái)自手機(jī) | 顯示全部樓層
PCA_PWM1= 0xc0|((Duty>>4)&0x30); //設(shè)置新的重裝值高2位         CCAP1H   = Duty;           //重裝值低8位
回復(fù)

使用道具 舉報(bào)

ID:584195 發(fā)表于 2021-8-6 19:50 | 顯示全部樓層
18701931930 發(fā)表于 2021-6-18 15:06
關(guān)鍵是有價(jià)無(wú)市,根本拿不到貨。
去年stc8h1k17 ssop20 含稅價(jià)1.35元
上個(gè)月從stc代理那里拿貨,單價(jià)6 ...

有錢人呀
招不招人!
回復(fù)

使用道具 舉報(bào)

ID:518902 發(fā)表于 2021-11-21 22:25 | 顯示全部樓層
好帖,喜歡~
回復(fù)

使用道具 舉報(bào)

ID:907700 發(fā)表于 2021-12-15 14:32 | 顯示全部樓層
怪不得我的也不正常,謝謝了
回復(fù)

使用道具 舉報(bào)

ID:877543 發(fā)表于 2021-12-17 15:45 | 顯示全部樓層
謝謝樓主,仿真成功了,中文注釋也很詳細(xì)
回復(fù)

使用道具 舉報(bào)

ID:140644 發(fā)表于 2022-2-5 12:33 | 顯示全部樓層
還沒(méi)有試過(guò)
回復(fù)

使用道具 舉報(bào)

ID:514317 發(fā)表于 2022-2-7 16:38 | 顯示全部樓層
STC8系列的PWM比老版本強(qiáng)   也多了很多寄存器   不看手冊(cè)上的例程還真不一定能調(diào)通   用什么特殊功能之前還是需要看下例程的   
回復(fù)

使用道具 舉報(bào)

ID:879902 發(fā)表于 2022-4-19 11:22 | 顯示全部樓層
我也是這個(gè)片子 PWM占空比修改遇到了問(wèn)題
回復(fù)

使用道具 舉報(bào)

ID:961114 發(fā)表于 2022-4-19 14:01 | 顯示全部樓層
11.png 22.png
回復(fù)

使用道具 舉報(bào)

ID:349729 發(fā)表于 2022-10-11 11:02 | 顯示全部樓層

怪不得我的也不正常,謝謝了
回復(fù)

使用道具 舉報(bào)

ID:824308 發(fā)表于 2022-10-16 14:49 | 顯示全部樓層
注釋很詳細(xì), 感謝分享
回復(fù)

使用道具 舉報(bào)

ID:950218 發(fā)表于 2022-10-18 09:30 | 顯示全部樓層
樓主你好!請(qǐng)問(wèn)使用腳1(P5.4)輸出PWM可以的嗎?可以的話,有什么需要注意的嗎?
回復(fù)

使用道具 舉報(bào)

ID:652434 發(fā)表于 2022-11-6 15:32 | 顯示全部樓層
感謝樓主分享詳細(xì)調(diào)試過(guò)程,我學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:1067572 發(fā)表于 2023-3-21 11:36 | 顯示全部樓層
有沒(méi)有試過(guò) CCAPM1   = 0xC2;           //使能PCA模塊0_PWM輸出  不是0X42
回復(fù)

使用道具 舉報(bào)

ID:64089 發(fā)表于 2023-4-24 17:00 | 顯示全部樓層
感謝樓主分享。剛好也在玩PWM,同樣10位的PWM參數(shù)寫超過(guò)FF就沒(méi)有輸出了,剛好翻到你的帖子,幫我解決了一個(gè)很大的問(wèn)題,實(shí)測(cè)樓主的程序是可以用的,再次感謝!
回復(fù)

使用道具 舉報(bào)

ID:364201 發(fā)表于 2023-6-15 10:08 | 顯示全部樓層
請(qǐng)教一下,如何控制同一個(gè)PCA模塊讓引腳輸出不同占空比
回復(fù)

使用道具 舉報(bào)

ID:364201 發(fā)表于 2023-6-18 16:03 | 顯示全部樓層
nsj21n 發(fā)表于 2023-4-24 17:00
感謝樓主分享。剛好也在玩PWM,同樣10位的PWM參數(shù)寫超過(guò)FF就沒(méi)有輸出了,剛好翻到你的帖子,幫我解決了一個(gè) ...

高位是空的,不需要賦值吧!
回復(fù)

使用道具 舉報(bào)

ID:464755 發(fā)表于 2023-9-9 06:41 來(lái)自手機(jī) | 顯示全部樓層
正好用到,PCA準(zhǔn)備做Da輸出。
回復(fù)

使用道具 舉報(bào)

ID:1093740 發(fā)表于 2023-10-27 15:11 | 顯示全部樓層
這兩個(gè)控制寄存器有影響么?沒(méi)看懂啊, 為啥關(guān)一下,才能寫,不關(guān)不讓寫呢
回復(fù)

使用道具 舉報(bào)

ID:1115376 發(fā)表于 2024-4-4 15:22 | 顯示全部樓層
大佬,我這個(gè)十位pwm電位器調(diào)節(jié)為何出這種波形 51hei圖片_20240404152202.jpg
回復(fù)

使用道具 舉報(bào)

ID:1109793 發(fā)表于 2024-4-6 09:33 | 顯示全部樓層
請(qǐng)問(wèn)10位的PWM頻率能到多少?
回復(fù)

使用道具 舉報(bào)

ID:961114 發(fā)表于 2024-4-7 14:39 | 顯示全部樓層
xiaobendan001 發(fā)表于 2024-4-6 09:33
請(qǐng)問(wèn)10位的PWM頻率能到多少?

STC32G12K128, PWM的時(shí)鐘源可以 144MHz/146MHz
回復(fù)

使用道具 舉報(bào)

ID:1130333 發(fā)表于 2025-3-1 02:28 來(lái)自手機(jī) | 顯示全部樓層
兩個(gè) 8位寄存器A和B,把 A的0和 1位,還有B的全部八位賦值給一個(gè) 16位的變量c,怎么寫,還有怎么封裝成函數(shù)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表