久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20750|回復: 41
打印 上一主題 下一主題
收起左側

關于STC8G單片機的PCA_10PWM輸出注意事項

  [復制鏈接]
跳轉到指定樓層
樓主
ID:554500 發(fā)表于 2021-5-9 01:43 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


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

這里說明下關于PWM寄存器:


10位PWM重裝值和比較值的高2位和低8位在兩個寄存器,PCA_PWMn和CCAPnH。
以前寫代碼習慣了根據(jù)數(shù)據(jù)手冊的寄存器從上往下配置,特殊寄存器除外。
以前配置8位PWM初始化代碼如下:
//8位PWM_PCA初始化
void PCA_Init()
{
        CCON=0x00;  //關閉PCA計數(shù)器,清除相關標志位
        CMOD=PCA_SYSCLK2;  //PCA時鐘源為系統(tǒng)時鐘2分頻  33.1776/2/1024=0.0162MHZ ==>16.2KHZ
        CL  =0x00;  //計數(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;   //啟動計數(shù)器
}


這樣,調節(jié)自己想要的占空比就OK了,8位PWM正常使用。所以,覺得修改PWM位數(shù)就行了。
于是,10位PWM配置如下:
//10位PWM_PCA初始化
//用電位器調節(jié)占空比
void PCA_Init()
{
        CCON=0x00;  //關閉PCA計數(shù)器,清除相關標志位
        CMOD=PCA_SYSCLK2;  //PCA時鐘源為系統(tǒng)時鐘2分頻  33.1776/2/1024=0.0162MHZ ==>16.2KHZ
        CL  =0x00;  //計數(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;   //啟動計數(shù)器
}


調節(jié)占空比的時候用示波器觀察波形,發(fā)現(xiàn)波形不對,波形的確是10位的,這點可以肯定。數(shù)據(jù)手冊看了一遍又一遍,覺得代碼沒問題啊。
實在沒辦法了。后來添加了串口功能,決定把相關寄存器通過串口發(fā)出來看看。
通過觀察發(fā)現(xiàn),PWM重裝值高2位永遠是00,低8位沒問題,調節(jié)占空比的代碼如下:
//設置脈沖寬度
void PWM0_Set_Duty(u16 Duty)
{
        //注意:在更新 10 位 PWM 的重載值時,必須先寫高兩位 XCCAPnH[1:0],再寫低 8 位 CCAPnH[7:0]。
        PCA_PWM0&= ~(3<<4);        //清零重裝值高2位
        PCA_PWM0|= (Duty>>4)&0x30; //設置新的重裝值高2位
        CCAP0H   = Duty;           //重裝值低8位
}
這樣寫應該沒錯啊,咋回事呢?
于是在main函數(shù)里測試下:
void main()
{
        u8 st;
        
        P_SW2|=0x80; //可以訪問擴展的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();
        }
}


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


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


最后代碼修改如下:
//10位PWMPCA初始化
void PCA_Init()
{
        CCON=0x00;  //關閉PCA計數(shù)器,清除相關標志位
        CMOD=PCA_SYSCLK2;  //PCA時鐘源為系統(tǒng)時鐘2分頻  33.1776/2/1024=0.0162MHZ ==>16.2KHZ
        CL  =0x00;  //計數(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;   //啟動計數(shù)器
}


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


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


以上是個人見解,如有說錯的,請大家指出,我會虛心求教!!
















評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏31 分享淘帖 頂7 踩
回復

使用道具 舉報

沙發(fā)
ID:359272 發(fā)表于 2021-5-18 17:16 | 只看該作者
非常感謝樓主的調試過程分享,正準備上手研究下。
回復

使用道具 舉報

板凳
ID:807182 發(fā)表于 2021-5-24 16:41 | 只看該作者
大佬,我想請教一下,我直接用這個給的官方例程移植過來,PWM就是沒有輸出?可以幫忙看一下嗎?
回復

使用道具 舉報

地板
ID:554500 發(fā)表于 2021-5-24 21:08 | 只看該作者
暖西夏 發(fā)表于 2021-5-24 16:41
大佬,我想請教一下,我直接用這個給的官方例程移植過來,PWM就是沒有輸出?可以幫忙看一下嗎?

代碼貼出來大家一起討論,共師兄習!!!
回復

使用道具 舉報

5#
ID:884843 發(fā)表于 2021-5-25 12:17 | 只看該作者
感謝分享調試心得
回復

使用道具 舉報

6#
ID:390307 發(fā)表于 2021-5-26 23:57 | 只看該作者
昨天正好也發(fā)現(xiàn)這個問題,感謝樓主踩坑分享
回復

使用道具 舉報

7#
ID:332838 發(fā)表于 2021-6-17 16:41 | 只看該作者
33.1776/2/1024=0.0162MHZ ==>16.2KHZ
請問一下,這里為什么要除以1024?
回復

使用道具 舉報

8#
ID:554500 發(fā)表于 2021-6-18 09:25 | 只看該作者
yonnhor 發(fā)表于 2021-6-17 16:41
33.1776/2/1024=0.0162MHZ ==>16.2KHZ
請問一下,這里為什么要除以1024?

因為PWM是10位的
回復

使用道具 舉報

9#
ID:272119 發(fā)表于 2021-6-18 14:38 | 只看該作者
STC8G1K08A 現(xiàn)在某一個寶行價5元以上吧,真心無法理解,1元不到的報價現(xiàn)在都5元過頭,還怎么搞小項目開發(fā)STC怎么用國產占領市場......
回復

使用道具 舉報

10#
ID:554500 發(fā)表于 2021-6-18 15:06 | 只看該作者
qq603599910 發(fā)表于 2021-6-18 14:38
STC8G1K08A 現(xiàn)在某一個寶行價5元以上吧,真心無法理解,1元不到的報價現(xiàn)在都5元過頭,還怎么搞小項目開發(fā)STC怎 ...

關鍵是有價無市,根本拿不到貨。
去年stc8h1k17 ssop20 含稅價1.35元
上個月從stc代理那里拿貨,單價6元,拿了3萬個,花了我18萬。
心在滴血啊。沒辦法,產品還得做。少賺點就少賺點。
回復

使用道具 舉報

11#
ID:155507 發(fā)表于 2021-6-26 12:24 | 只看該作者
18701931930 發(fā)表于 2021-6-18 15:06
關鍵是有價無市,根本拿不到貨。
去年stc8h1k17 ssop20 含稅價1.35元
上個月從stc代理那里拿貨,單價6 ...

某一個寶上的價格高一點,自己玩玩研究無所謂,量大還是要聯(lián)系原廠訂購。
回復

使用道具 舉報

12#
ID:927469 發(fā)表于 2021-6-29 23:04 | 只看該作者
樓主這個電路圖能看看嗎
回復

使用道具 舉報

13#
ID:554500 發(fā)表于 2021-6-30 08:36 | 只看該作者
kmikmi 發(fā)表于 2021-6-29 23:04
樓主這個電路圖能看看嗎


單片機:STC8G1K08A
PWM輸出連接 P3.2-P3.3
回復

使用道具 舉報

14#
ID:893179 發(fā)表于 2021-7-10 18:25 | 只看該作者
“//用電位器調節(jié)占空比”    ————    怎么用電位器調節(jié)占空比了?
回復

使用道具 舉報

15#
ID:554500 發(fā)表于 2021-7-11 16:08 | 只看該作者
420793043 發(fā)表于 2021-7-10 18:25
“//用電位器調節(jié)占空比”    ————    怎么用電位器調節(jié)占空比了?

電位器調節(jié)就用AD轉換,模擬量對應想要的占空比
回復

使用道具 舉報

16#
ID:120977 發(fā)表于 2021-8-6 10:47 來自觸屏版 | 只看該作者
PCA_PWM1= 0xc0|((Duty>>4)&0x30); //設置新的重裝值高2位         CCAP1H   = Duty;           //重裝值低8位
回復

使用道具 舉報

17#
ID:584195 發(fā)表于 2021-8-6 19:50 | 只看該作者
18701931930 發(fā)表于 2021-6-18 15:06
關鍵是有價無市,根本拿不到貨。
去年stc8h1k17 ssop20 含稅價1.35元
上個月從stc代理那里拿貨,單價6 ...

有錢人呀
招不招人!
回復

使用道具 舉報

18#
ID:518902 發(fā)表于 2021-11-21 22:25 | 只看該作者
好帖,喜歡~
回復

使用道具 舉報

19#
ID:907700 發(fā)表于 2021-12-15 14:32 | 只看該作者
怪不得我的也不正常,謝謝了
回復

使用道具 舉報

20#
ID:877543 發(fā)表于 2021-12-17 15:45 | 只看該作者
謝謝樓主,仿真成功了,中文注釋也很詳細
回復

使用道具 舉報

21#
ID:140644 發(fā)表于 2022-2-5 12:33 | 只看該作者
還沒有試過
回復

使用道具 舉報

22#
ID:514317 發(fā)表于 2022-2-7 16:38 | 只看該作者
STC8系列的PWM比老版本強   也多了很多寄存器   不看手冊上的例程還真不一定能調通   用什么特殊功能之前還是需要看下例程的   
回復

使用道具 舉報

23#
ID:879902 發(fā)表于 2022-4-19 11:22 | 只看該作者
我也是這個片子 PWM占空比修改遇到了問題
回復

使用道具 舉報

24#
ID:961114 發(fā)表于 2022-4-19 14:01 | 只看該作者
回復

使用道具 舉報

25#
ID:349729 發(fā)表于 2022-10-11 11:02 | 只看該作者

怪不得我的也不正常,謝謝了
回復

使用道具 舉報

26#
ID:824308 發(fā)表于 2022-10-16 14:49 | 只看該作者
注釋很詳細, 感謝分享
回復

使用道具 舉報

27#
ID:950218 發(fā)表于 2022-10-18 09:30 | 只看該作者
樓主你好!請問使用腳1(P5.4)輸出PWM可以的嗎?可以的話,有什么需要注意的嗎?
回復

使用道具 舉報

28#
ID:652434 發(fā)表于 2022-11-6 15:32 | 只看該作者
感謝樓主分享詳細調試過程,我學習了
回復

使用道具 舉報

29#
ID:1067572 發(fā)表于 2023-3-21 11:36 | 只看該作者
有沒有試過 CCAPM1   = 0xC2;           //使能PCA模塊0_PWM輸出  不是0X42
回復

使用道具 舉報

30#
ID:64089 發(fā)表于 2023-4-24 17:00 | 只看該作者
感謝樓主分享。剛好也在玩PWM,同樣10位的PWM參數(shù)寫超過FF就沒有輸出了,剛好翻到你的帖子,幫我解決了一個很大的問題,實測樓主的程序是可以用的,再次感謝!
回復

使用道具 舉報

31#
ID:364201 發(fā)表于 2023-6-15 10:08 | 只看該作者
請教一下,如何控制同一個PCA模塊讓引腳輸出不同占空比
回復

使用道具 舉報

32#
ID:364201 發(fā)表于 2023-6-18 16:03 | 只看該作者
nsj21n 發(fā)表于 2023-4-24 17:00
感謝樓主分享。剛好也在玩PWM,同樣10位的PWM參數(shù)寫超過FF就沒有輸出了,剛好翻到你的帖子,幫我解決了一個 ...

高位是空的,不需要賦值吧!
回復

使用道具 舉報

33#
ID:464755 發(fā)表于 2023-9-9 06:41 來自觸屏版 | 只看該作者
正好用到,PCA準備做Da輸出。
回復

使用道具 舉報

34#
ID:1093740 發(fā)表于 2023-10-27 15:11 | 只看該作者
這兩個控制寄存器有影響么?沒看懂啊, 為啥關一下,才能寫,不關不讓寫呢
回復

使用道具 舉報

35#
ID:1115376 發(fā)表于 2024-4-4 15:22 | 只看該作者
大佬,我這個十位pwm電位器調節(jié)為何出這種波形
回復

使用道具 舉報

36#
ID:1109793 發(fā)表于 2024-4-6 09:33 | 只看該作者
請問10位的PWM頻率能到多少?
回復

使用道具 舉報

37#
ID:961114 發(fā)表于 2024-4-7 14:39 | 只看該作者
xiaobendan001 發(fā)表于 2024-4-6 09:33
請問10位的PWM頻率能到多少?

STC32G12K128, PWM的時鐘源可以 144MHz/146MHz
回復

使用道具 舉報

38#
ID:1130333 發(fā)表于 2025-3-1 02:28 來自觸屏版 | 只看該作者
兩個 8位寄存器A和B,把 A的0和 1位,還有B的全部八位賦值給一個 16位的變量c,怎么寫,還有怎么封裝成函數(shù)
回復

使用道具 舉報

39#
ID:554500 發(fā)表于 2025-6-16 09:34 | 只看該作者
vb2002 發(fā)表于 2025-3-1 02:28
兩個 8位寄存器A和B,把 A的0和 1位,還有B的全部八位賦值給一個 16位的變量c,怎么寫,還有怎么封裝成函數(shù)

// reg_B高字節(jié),reg_A低字節(jié)
uint16_t conv(uint8_t reg_A, uint8_t reg_B)
{
        uint16_t dat = reg_B;
        dat <<= 2;
        dat |= reg_A & 0x03;
        return dat;
}

// reg_A高字節(jié),reg_B低字節(jié)
uint16_t conv1(uint8_t reg_A, uint8_t reg_B)
{
        uint16_t dat = reg_A & 0x03;
        dat <<= 8;
        dat |= reg_B;
        return dat;
}
回復

使用道具 舉報

40#
ID:554500 發(fā)表于 2025-6-17 08:50 | 只看該作者
weilemin123 發(fā)表于 2023-10-27 15:11
這兩個控制寄存器有影響么?沒看懂啊, 為啥關一下,才能寫,不關不讓寫呢

你寫了寄存器數(shù)據(jù)也不會改變。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品亚洲片在线播放 | 中文字幕亚洲精品 | 一区二区三区四区不卡 | 成年人免费网站 | 日韩av手机在线观看 | 国产精品久久亚洲7777 | 精品国产一区二区在线 | 天天看片天天干 | 午夜电影网 | www312aⅴ欧美在线看 | 中文字幕在线一区二区三区 | 精品欧美一区二区久久久伦 | 国产视频二区 | 美国十次成人欧美色导视频 | 亚州毛片 | 国产清纯白嫩初高生在线播放视频 | 在线观看涩涩视频 | 国产综合久久 | 美女国产一区 | 亚洲一区二区三区久久 | 国产精品免费在线 | 中文字幕一级毛片视频 | 亚洲成人中文字幕 | 97caoporn国产免费人人 | 中文字幕在线精品 | 一区二区三区电影在线观看 | 欧美日韩电影一区二区 | 成人精品视频 | 欧美一区在线视频 | 日本精品久久 | 一区二区三区四区视频 | av av在线 | 久久一久久 | 成人一区二区三区在线 | 成在线人视频免费视频 | 美女黄视频网站 | 精品一区电影 | www久久久 | 国产福利在线视频 | 97免费视频在线观看 | 天天操天天拍 |