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

標題: 關于STC8G單片機的PCA_10PWM輸出注意事項 [打印本頁]

作者: 18701931930    時間: 2021-5-9 01:43
標題: 關于STC8G單片機的PCA_10PWM輸出注意事項


以前用過STC15W的8位PWM,配置很簡單。
數據手冊上也有參考代碼。
一直渴望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。
以前寫代碼習慣了根據數據手冊的寄存器從上往下配置,特殊寄存器除外。
以前配置8位PWM初始化代碼如下:
//8位PWM_PCA初始化
void PCA_Init()
{
        CCON=0x00;  //關閉PCA計數器,清除相關標志位
        CMOD=PCA_SYSCLK2;  //PCA時鐘源為系統時鐘2分頻  33.1776/2/1024=0.0162MHZ ==>16.2KHZ
        CL  =0x00;  //計數器清零
        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;   //啟動計數器
}


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


調節占空比的時候用示波器觀察波形,發現波形不對,波形的確是10位的,這點可以肯定。數據手冊看了一遍又一遍,覺得代碼沒問題啊。
實在沒辦法了。后來添加了串口功能,決定把相關寄存器通過串口發出來看看。
通過觀察發現,PWM重裝值高2位永遠是00,低8位沒問題,調節占空比的代碼如下:
//設置脈沖寬度
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函數里測試下:
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();
        }
}


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


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


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


//設置脈沖寬度
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輸出
}


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

















作者: slf252    時間: 2021-5-18 17:16
非常感謝樓主的調試過程分享,正準備上手研究下。
作者: 暖西夏    時間: 2021-5-24 16:41
大佬,我想請教一下,我直接用這個給的官方例程移植過來,PWM就是沒有輸出?可以幫忙看一下嗎?
作者: 18701931930    時間: 2021-5-24 21:08
暖西夏 發表于 2021-5-24 16:41
大佬,我想請教一下,我直接用這個給的官方例程移植過來,PWM就是沒有輸出?可以幫忙看一下嗎?

代碼貼出來大家一起討論,共師兄習!!!
作者: zhizhuoggg    時間: 2021-5-25 12:17
感謝分享調試心得
作者: 絲瓜    時間: 2021-5-26 23:57
昨天正好也發現這個問題,感謝樓主踩坑分享
作者: yonnhor    時間: 2021-6-17 16:41
33.1776/2/1024=0.0162MHZ ==>16.2KHZ
請問一下,這里為什么要除以1024?
作者: 18701931930    時間: 2021-6-18 09:25
yonnhor 發表于 2021-6-17 16:41
33.1776/2/1024=0.0162MHZ ==>16.2KHZ
請問一下,這里為什么要除以1024?

因為PWM是10位的
作者: qq603599910    時間: 2021-6-18 14:38
STC8G1K08A 現在某一個寶行價5元以上吧,真心無法理解,1元不到的報價現在都5元過頭,還怎么搞小項目開發STC怎么用國產占領市場......
作者: 18701931930    時間: 2021-6-18 15:06
qq603599910 發表于 2021-6-18 14:38
STC8G1K08A 現在某一個寶行價5元以上吧,真心無法理解,1元不到的報價現在都5元過頭,還怎么搞小項目開發STC怎 ...

關鍵是有價無市,根本拿不到貨。
去年stc8h1k17 ssop20 含稅價1.35元
上個月從stc代理那里拿貨,單價6元,拿了3萬個,花了我18萬。
心在滴血啊。沒辦法,產品還得做。少賺點就少賺點。
作者: angmall    時間: 2021-6-26 12:24
18701931930 發表于 2021-6-18 15:06
關鍵是有價無市,根本拿不到貨。
去年stc8h1k17 ssop20 含稅價1.35元
上個月從stc代理那里拿貨,單價6 ...

某一個寶上的價格高一點,自己玩玩研究無所謂,量大還是要聯系原廠訂購。
作者: kmikmi    時間: 2021-6-29 23:04
樓主這個電路圖能看看嗎
作者: 18701931930    時間: 2021-6-30 08:36
kmikmi 發表于 2021-6-29 23:04
樓主這個電路圖能看看嗎


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

作者: 420793043    時間: 2021-7-10 18:25
“//用電位器調節占空比”    ————    怎么用電位器調節占空比了?
作者: 18701931930    時間: 2021-7-11 16:08
420793043 發表于 2021-7-10 18:25
“//用電位器調節占空比”    ————    怎么用電位器調節占空比了?

電位器調節就用AD轉換,模擬量對應想要的占空比
作者: wbhhyp    時間: 2021-8-6 10:47
PCA_PWM1= 0xc0|((Duty>>4)&0x30); //設置新的重裝值高2位         CCAP1H   = Duty;           //重裝值低8位
作者: zyluglugl    時間: 2021-8-6 19:50
18701931930 發表于 2021-6-18 15:06
關鍵是有價無市,根本拿不到貨。
去年stc8h1k17 ssop20 含稅價1.35元
上個月從stc代理那里拿貨,單價6 ...

有錢人呀
招不招人!
作者: laopihappy123    時間: 2021-11-21 22:25
好帖,喜歡~
作者: xzhyahoo1    時間: 2021-12-15 14:32
怪不得我的也不正常,謝謝了
作者: wofa    時間: 2021-12-17 15:45
謝謝樓主,仿真成功了,中文注釋也很詳細
作者: czhaii    時間: 2022-2-5 12:33
還沒有試過
作者: lzzasd    時間: 2022-2-7 16:38
STC8系列的PWM比老版本強   也多了很多寄存器   不看手冊上的例程還真不一定能調通   用什么特殊功能之前還是需要看下例程的   
作者: kuafoo    時間: 2022-4-19 11:22
我也是這個片子 PWM占空比修改遇到了問題
作者: STC莊偉    時間: 2022-4-19 14:01

作者: ZHOUBOAK    時間: 2022-10-11 11:02

怪不得我的也不正常,謝謝了
作者: steven66    時間: 2022-10-16 14:49
注釋很詳細, 感謝分享
作者: 樂魚居    時間: 2022-10-18 09:30
樓主你好!請問使用腳1(P5.4)輸出PWM可以的嗎?可以的話,有什么需要注意的嗎?
作者: zyjgkdq    時間: 2022-11-6 15:32
感謝樓主分享詳細調試過程,我學習了
作者: Carl2023    時間: 2023-3-21 11:36
有沒有試過 CCAPM1   = 0xC2;           //使能PCA模塊0_PWM輸出  不是0X42
作者: nsj21n    時間: 2023-4-24 17:00
感謝樓主分享。剛好也在玩PWM,同樣10位的PWM參數寫超過FF就沒有輸出了,剛好翻到你的帖子,幫我解決了一個很大的問題,實測樓主的程序是可以用的,再次感謝!
作者: 597259498    時間: 2023-6-15 10:08
請教一下,如何控制同一個PCA模塊讓引腳輸出不同占空比
作者: 597259498    時間: 2023-6-18 16:03
nsj21n 發表于 2023-4-24 17:00
感謝樓主分享。剛好也在玩PWM,同樣10位的PWM參數寫超過FF就沒有輸出了,剛好翻到你的帖子,幫我解決了一個 ...

高位是空的,不需要賦值吧!
作者: nsush    時間: 2023-9-9 06:41
正好用到,PCA準備做Da輸出。
作者: weilemin123    時間: 2023-10-27 15:11
這兩個控制寄存器有影響么?沒看懂啊, 為啥關一下,才能寫,不關不讓寫呢
作者: TR1999    時間: 2024-4-4 15:22
大佬,我這個十位pwm電位器調節為何出這種波形
作者: xiaobendan001    時間: 2024-4-6 09:33
請問10位的PWM頻率能到多少?

作者: STC莊偉    時間: 2024-4-7 14:39
xiaobendan001 發表于 2024-4-6 09:33
請問10位的PWM頻率能到多少?

STC32G12K128, PWM的時鐘源可以 144MHz/146MHz
作者: vb2002    時間: 2025-3-1 02:28
兩個 8位寄存器A和B,把 A的0和 1位,還有B的全部八位賦值給一個 16位的變量c,怎么寫,還有怎么封裝成函數
作者: 18701931930    時間: 2025-6-16 09:34
vb2002 發表于 2025-3-1 02:28
兩個 8位寄存器A和B,把 A的0和 1位,還有B的全部八位賦值給一個 16位的變量c,怎么寫,還有怎么封裝成函數

// reg_B高字節,reg_A低字節
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高字節,reg_B低字節
uint16_t conv1(uint8_t reg_A, uint8_t reg_B)
{
        uint16_t dat = reg_A & 0x03;
        dat <<= 8;
        dat |= reg_B;
        return dat;
}
作者: 18701931930    時間: 2025-6-17 08:50
weilemin123 發表于 2023-10-27 15:11
這兩個控制寄存器有影響么?沒看懂啊, 為啥關一下,才能寫,不關不讓寫呢

你寫了寄存器數據也不會改變。
作者: 太陽雨ZW    時間: 2025-6-18 16:49
18701931930 發表于 2025-6-17 08:50
你寫了寄存器數據也不會改變。

請教大佬,我用10位PWM的呼吸燈程序驗證,不能正常是怎么回事?
作者: 太陽雨ZW    時間: 2025-6-21 16:35
參照16樓的,如下寫呼吸燈正常了。
//設置脈沖寬度
void PWM0_Set_Duty(u16 Duty)   //P3.2
{
        PCA_PWM0&= ~(3<<4);        //清零重裝值高2位
        PCA_PWM0 = (Duty>>4)&0x30|0xc0; //設置新的重裝值高2位
        CCAP0H   = Duty;           //重裝值低8位
}

//設置脈沖寬度
void PWM1_Set_Duty(u16 Duty)   //P3.3
{
        PCA_PWM1&= ~(3<<4);        //清零重裝值高2位
        PCA_PWM1 = (Duty>>4)&0x30|0xc0; //設置新的重裝值高2位
        CCAP1H   = Duty;           //重裝值低8位
}




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品国产色 | 国产一区二区免费 | 亚洲视频在线免费观看 | 色婷婷av一区二区三区软件 | 中文字幕在线一区二区三区 | 中文字幕一区二区三区精彩视频 | 亚洲精品日韩精品 | 色综合久久天天综合网 | 欧美日韩精品免费 | 免费观看a级毛片在线播放 黄网站免费入口 | 国产精品久久久久久久久久久久 | 99视频网| 国产片侵犯亲女视频播放 | 日韩精品免费一区二区在线观看 | 久久久久久综合 | 四虎永久在线精品免费一区二 | 99热精品在线 | 日韩精品一区二区三区四区 | 国产精品久久久久久久免费观看 | 欧美一级欧美三级在线观看 | 日韩欧美在线观看视频 | 国产美女精品视频免费观看 | 欧美日韩三级在线观看 | 在线视频国产一区 | 久久久久久久久久一区 | 久久中文视频 | 婷婷久久一区 | 午夜寂寞影院列表 | 亚洲高清在线观看 | 天堂一区在线观看 | 亚洲精品在线视频 | 欧美高清视频 | 欧美综合一区二区 | 亚洲成人精品一区二区 | 日韩α片 | 国产欧美二区 | 91精品久久久久久久久中文字幕 | 亚洲一区二区三区四区五区午夜 | 免费看黄视频网站 | 日韩精品免费一区二区在线观看 | 欧美在线成人影院 |