![]() |
發(fā)布時間: 2023-4-6 20:23
正文摘要:選用的單片機芯片8H1K08,只有定時器0,1,2 。 用了兩路串口分別是57600,9600.一個接屏幕,一個接讀卡器。占用兩個定時器,最后一個定時器用了計時和別的功能,現(xiàn)在還需要一路IO口輸出PWM功能,周期100us ,10us~20 ... |
劉佑紅 發(fā)表于 2023-7-18 11:45 說得很詳細,剛好有個項目要用,參考下,謝謝 |
STC8H單片機PWM的寄存器太多,且有些寄存器的功能看著比較相似,手冊介紹的也不太清楚,難以區(qū)別,設置起來非常困難,我前前后后閱讀器多次并反復設置測試,PWM才正常,但其捕捉功能我現(xiàn)在還沒明白。 樓主的PWM沒有輸出,我在STC8H1K16的4N已輸出正常,頻率和占空比按照預設要求輸出,經(jīng)對比發(fā)現(xiàn)對寄存器的設置有以下不同: ![]() 1. PWMA_CCMR4。 樓主設置 0x60=0110 0000,我設置的是0x68=0110 1000,我與樓主相比是多開啟了占空比數(shù)值預裝載功能。官方的例程僅是輸出PWM測試,不改變占空比CCR和計數(shù)周期ARR的數(shù)值,所以官方例程沒有開啟占空比和計數(shù)周期預裝載功能,在實際應用時大都需要是是調(diào)整占空比和頻率,更改預裝載值,故大多數(shù)情況下是開啟。 2. PWMA_CCER2。樓主設置0x10=0001 0000,使B4位的CC4E=1,開啟的是4P比較功能,我設置的是0x40=0100 0000,使B6位的CC4NE=1,開啟的是4N比較功能。 我們開啟的是4N功能,故PWMA_CCER2應該設置為0x40才行。 3.樓主沒有設置PWMA_PS,即PWMA_PS是復位值0x00,其設置為4N在P1.7腳輸出;我設置PWMA_PS = 0x40=0100 0000,設置4N在P2.7腳輸出。樓主的是STC8H1K08,4N欲在P3.3輸出,設置PWMA_PS= 0xC0才行(11000000)。 4.PWMA_CR1。區(qū)別同1,我是開啟了ARR預裝載功能。 |
Aresxiaogui 發(fā)表于 2023-7-18 09:29 我的PWM輸出頻率范圍是1-25KHZ(由外部電壓改變頻率),系統(tǒng)是12MHZ,PWM時鐘不分頻。STC8H1K08的P5.4是PWM6口輸出,相應的寄存器需作對應修改。 |
劉佑紅 發(fā)表于 2023-7-17 21:02 請問你的頻率設置的多少呢,為什么我用你這個改一下在P54口輸出就沒有效果呢 |
剛測,正常輸出可調(diào)PWM,ARR和CCR采用預裝載方式,在使用中可隨時改變,寄存器初始化可參照設置。采用的STC8H1K16,P2.7腳輸出(PWM4N) P_SW2 |= 0x80; //開啟P_SW2寄存器1000 0000 PWMA_CCER2 = 0x00; //寫CCMRx前必須先清零CCERx關閉通道 PWMA_CCMR4 = 0x68; //設置CC4為PWM輸出模式,開啟預裝載CCR4 0110 1000 //PWMA_CCMR4 = 0x78; //設置CC4為PWM輸出模式,開啟預裝載CCR4 0111 1000(負極性輸出) PWMA_CCER2 = 0x40; //0100 0000單獨使能CC4N通道(不開CC4P),輸出高電平 PWMA_CCR4 = 2500; //設置占空比時間 PWMA_ARR = 5000; //設置周期時間 PWMA_PS = 0x40; //PWM4N在P2.7輸出0100 0000 PWMA_ENO = 0x80; //使能PWM4N端口輸出1000 0000 PWMA_BKR = 0x80; //使能主輸出1000 0000 PWMA_CR1 = 0x81; //開始計時 1000 0001開啟自動預裝載PWMA_ARR |
樓主搞定了嗎,我用P5.4想輸出PWM也一直輸出不了 |
劉佑紅 發(fā)表于 2023-6-25 18:33 為什么我用這段代碼在keil上進行軟件仿真時P3.3一直輸出的是高電平呢 |
建議先測試STC官方的例程,然后再修改移植。 |
是設置的問題,以下我測試輸出正常,占空比符合設置預期。輸出端口也是P3.3 include<stc8h.h> //STC8H1K08 TSSOP20 sbit out = P3^3; //電機PWM信號輸出 /*************************主函數(shù)**********************************/ void main() { P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00; P1M1 = 0x00; P2M0 = 0x00; P2M1 = 0x00; P3M0 = 0x08; P3M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; P_SW2 = 0x80; PWMB_CCER2 = 0x00; //寫CCMRx前必須先清零CCERx關閉通道 PWMB_CCMR3= 0x60; //設置CC7為PWMA輸出模式 PWMB_CCER2 = 0x01; //使能CC7通道 PWMB_CCR7 = 5; //設置占空比時間 PWMB_ARR = 999; //設置周期時間 PWMB_ENO = 0x10; //使能PWM7端口輸出 PWMB_PS = 0x10; //PWM7在P3.3輸出 PWMB_BKR = 0x80; //使能主輸出 PWMB_CR1 = 0x01; //開始計時 while (1); } |
有些型號默認輸出高阻態(tài),不知道你設置沒 還需要用輔助寄存器切換IO口 可以參考PCA相關例程 |
io要配置推挽輸出 |
我也正在試驗它,也是P3.3輸出,我覺得例程是PWM1P腳輸出的,要用PWMA通道4在P3.3輸出,還需定義輸出腳才行,所以在例程的基礎上增加了:PWMA_PS = 0xC0; //使能PWM4N端口選在P3.3(14腳),甚至還要改定義PWMA_CCER4和PWMA_CCMR4,但是否可以輸出,還沒有測試。 void pwmout(u16 zhankong) { P_SW2 |= 0x80; //使能XFR PWMA_CCER1 = 0x00; //寫CCMRx前必須先清零CCERx關閉通道 PWMA_CCMR1 = 0x60; //設置CC1為PWMA輸出模式 PWMA_CCER1 = 0x01; //使能CC1通道 PWMA_CCR1 = zhankong; //設置占空比時間 PWMA_ARR = 99; //設置周期時間24MHZ時,PWM輸出120KHZ PWMA_ENO = 0x80; //使能PWM4N端口輸出 PWMA_PS = 0xC0; //使能PWM4N端口選在P3.3(14腳) PWMA_BKR = 0x80; //使能主輸出 PWMA_CR1 = 0x01; //開始計時 } |
Powered by 單片機教程網(wǎng)