STM8SPWM應用
前幾天有個項目用到PWM,今天整理下,弄個氛圍燈;記錄下,以后忘記了返回來還能看看。
思路就是在硬件端設置個按鍵,按下全局變量Key_num的值+1,按鍵一開始我用輪詢法做的,后來覺得輪詢法延時可能導致未知的問題,現在用中斷法做;根據Key_num的值,用switch語句選擇要變換的模樣。
上代碼:
/*****************************************************************************
* @function : Tim2_Init
* @brief : TIM2初始化函數 CH1用作出LED——G的呼吸變化燈
* @note : STM8S005
* @param : null
* @retval : null
* @author : 2016.03.23 by Steam.Yang
2016.11.02 RPP 學習并增加注釋
******************************************************************************/
void Tim2_Init(void) //TIM2的初始化語句們
{
//配置通道1
TIM2_TimeBaseInit(TIM2_PRESCALER_8, 999); //第一步配置時基單元,先設置預分頻PSCRH/L高低八位 寄存器,再設置自動裝載寄存器ARRH/L。
TIM2_OC1Init(TIM2_OCMODE_PWM1,
TIM2_OUTPUTSTATE_ENABLE,
0,
TIM2_OCPOLARITY_LOW); //然后配置通道的輸出模式為PWM,啟用輸出比較,占空比設置為0,輸出為低電平
TIM2_OC1PreloadConfig(ENABLE);
TIM2_Cmd(ENABLE);
//配置通道2
TIM2_TimeBaseInit(TIM2_PRESCALER_8, 999); //第一步配置時基單元,先設置預分頻PSCRH/L高低八位 寄存器,再設置自動裝載寄存器ARRH/L。
TIM2_OC2Init(TIM2_OCMODE_PWM1,
TIM2_OUTPUTSTATE_ENABLE,
0,
TIM2_OCPOLARITY_LOW); //然后配置通道的輸出模式為PWM,啟用輸出比較,占空比設置為0,輸出為(低電平).105s4是低電平點亮
TIM2_OC2PreloadConfig(ENABLE); //開啟預裝載寄存器
TIM2_Cmd(ENABLE); //最后的開啟 啟用定時器
//配置通道3
TIM2_TimeBaseInit(TIM2_PRESCALER_8, 999); //第一步配置時基單元,先設置預分頻PSCRH/L高低八位 寄存器,再設置自動裝載寄存器ARRH/L。
TIM2_OC3Init(TIM2_OCMODE_PWM1,
TIM2_OUTPUTSTATE_ENABLE,
0,
TIM2_OCPOLARITY_LOW); //然后配置通道的輸出模式為PWM,啟用輸出比較,占空比設置為0,輸出為低電平
TIM2_OC3PreloadConfig(ENABLE);
TIM2_Cmd(ENABLE);
}
這段代碼為PWM初始化代碼,被折騰了好幾天,手頭上的105S4跟別人就是不一樣,他非要低電平點亮小燈。。。。,心累這段代碼比較重要。
下面的是主函數
int main( void )
{
CLK_HSICmd(ENABLE); //配置個時鐘先
GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT);//初始化按鍵的GPIO口 上拉輸入
Tim2_Init(); //再初始化TIM2 PWM1輸出模式
while(1)
{
Key_Press(); //再調用按鍵
//再給PWM呼吸燈占空比的值
if((!sta) && (PWM<1000)) //比較好的循環
{
PWM++;
if(PWM == 1000) sta = 1;
}
if((sta) && (PWM>0))
{
PWM--;
if(PWM == 0) sta = 0;
}
Delay_Us(500); //延時調整呼吸的速度
switch(Key_num){
case 0: //沒有按下 或者按到第7下時 全滅,進行清零
TIM2_SetCompare1(0);
TIM2_SetCompare2(0);
TIM2_SetCompare3(0);
break;
case 1:
TIM2_SetCompare1(1000); //按第一下,計數1, W燈常亮1 (1000常亮 PWM呼吸 0關閉)
break;
case 2: //按第二下,計數2,W燈呼吸2
//TIM2_Cmd(DISABLE);//本來想關掉PWM來進行關閉燈亮,結果不能關,關了后面就不執行了 要重新做初始化 要做其他處理
TIM2_SetCompare1(PWM);
break;
case 3:
TIM2_SetCompare1(0);
TIM2_SetCompare2(1000); //按三下,計數3,G燈常亮 ,同時要關掉前面亮著的
break;
case 4: //按四下,計數4,G燈呼吸
TIM2_SetCompare2(PWM); //
break;
case 5:
TIM2_SetCompare2(0); //按第五下,計數5,B燈常亮
TIM2_SetCompare3(1000); //
break;
case 6: //按第六下,計數6,B燈呼吸
TIM2_SetCompare3(PWM); //
break;
case 7: //全呼吸
TIM2_SetCompare1(PWM);
TIM2_SetCompare2(PWM);
`
TIM2_SetCompare3(PWM);
}
}
}
PWM不能關 關了就要重新初始化,所以選變成0 他就不亮了。這個循環結構是非常好的循環結構,很多書上的循環結構都是從0-100 沒有100-0 燈呼吸很突兀,所以建議用這種。
中斷的按鍵函數
放在中斷里面
if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_7) == 0)
{
delay_us(5000); //去抖延時
if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_7) == 0)
{
while(GPIO_ReadInputPin(GPIOC, GPIO_PIN_7) == 0);
Key_num++;
if(Key_num == 2)
{
Key_num=0;
}
}
}
寫完了,有什么再補充吧,
吐槽這鬼編譯器,惡心 好幾次都代碼上不去
補充:
我師父教我的 哈哈
首先該計數器,循環技術,例如從0到ARR,那么這個ARR就決定了PWM的周期,
PWM周期=(ARR+1)*計數器時鐘的周期.
PWM頻率=計數器時鐘的頻率/(ARR+1)
在計數器模塊中還有一個比較器,比較器有兩個輸入,一個是計數器的當前值,另一個是可以設置的數,這個數來著一個比較寄存器.當計數器的值小于比較寄存器的值時,輸出為1(也可以是0),當計數器的值大于或者等于比較器寄存器的值時,輸出為0(也可以是1,與前面對應).
STM8–PWM初始化流程
1、時基初始化,得出PWM的頻率(周期)
2、初始化輸出比較通道,確定是哪個模式、通道、脈沖寬度(確定占空比)、和電平。
3、輸出比較通預裝載使能
4、允許主輸出(TIM1)
5、使能定時器
隨時改變PWM頻率:
void TIM1_SetAutoreload(uint16_t Autoreload);//設置自動重裝寄存器的值
隨時改變占空比:
TIM1_SetCompare1(0x0000);//設置捕獲比較寄存器的值
上一篇:stm8 TIM2 PWM配置
下一篇:STM8S系列單片機TIM1的PWM配置與TIM2的區別
推薦閱讀
史海拾趣
為了進一步提升競爭力,Deutron Electronics Corp積極尋求國際合作與并購機會。公司與多家國際知名電子企業建立了戰略合作關系,共同研發新產品和技術。同時,公司還成功收購了幾家具有核心技術的電子企業,增強了自身的研發和生產能力。這些合作與并購為Deutron Electronics Corp帶來了更多的發展機遇和市場空間。
BH Electronics的創立源于創始人李明對電子技術的深厚興趣和敏銳洞察。在20世紀90年代初,電子市場剛剛起步,李明憑借對市場的精準判斷,決定投身于這一新興行業。他帶領一支小團隊,在簡陋的辦公室中開始了艱苦的創業歷程。他們晝夜兼程,研發出了一款具有競爭力的電子元件,成功打開了市場的大門。雖然初期資金匱乏,市場認可度低,但李明和他的團隊憑借堅韌不拔的精神,逐步在市場中站穩了腳跟。
在半導體行業中,供應鏈的穩定性和可靠性對于企業的生存和發展至關重要。晶岳電子深知這一點,因此一直致力于與流片及封裝廠建立長期穩定的合作關系。公司的晶圓流片合作伙伴包括大陸的CSMC、ASMC,臺灣的世界先進等公司;封裝的合作伙伴則包括長電科技、上海芯哲等大陸上市企業。通過與這些合作伙伴的緊密合作,晶岳電子確保了產品質量的穩定性和交貨期的可靠性,為公司的持續發展提供了有力保障。
這五個故事只是上海晶岳(AFSEMI)公司發展歷程中的一部分,但它們充分展示了晶岳電子在電子行業中的崛起和成長。憑借對技術的執著追求和對市場的敏銳洞察,晶岳電子在激烈的市場競爭中脫穎而出,成為了行業內的一支重要力量。
高創科技起源于1987年的以色列,最初是一家專注于直驅運動控制驅動器開發的廠商。在以色列的三十多年里,高創積累了豐富的軟件算法技術,特別是在運動控制領域形成了獨特優勢。這種積累不僅體現在其產品的穩定性和高性能上,更為后續的技術創新和市場拓展奠定了堅實基礎。
隨著全球市場的不斷擴展,Hosiden積極實施全球化戰略,以滿足全球客戶對高質量電子產品的需求。公司不僅在日本本土擁有強大的生產基地和銷售網絡,還通過設立海外分支機構、與國際知名企業建立戰略合作關系等方式,不斷拓寬其全球市場版圖。例如,Hosiden在中國市場通過投資豪熙電電子(上海)有限公司等方式,加強了其在中國及亞太地區的業務布局。
比亞迪的發展可以追溯到1995年,當時王傳福創立了這家公司,最初專注于生產小型電池。在初創期,比亞迪通過模仿日本三洋和索尼的產品快速積累了生產經驗。然而,王傳福深知模仿不是長久之計,因此他果斷地決定轉向自主研發和創新。這一決策在日后證明是極其明智的。隨著技術的不斷積累,比亞迪于1997年開始量產鋰離子電池,并成功實現了年銷售額突破1億元。這一里程碑標志著比亞迪在電池技術領域取得了重大突破,為其日后在電子行業的發展奠定了堅實基礎。
1、請問verilog中: 1)4\'h9,4\'d9有什么區別? 2)4\'d1,4\'h1,4\'b1又有什么區別? 我在寫程序的過秤中經常遇到熟知的問題二相當的頭疼。 依照老師的說法:1)中,4\'h9指的是用四位二進制數表示的16進制數9,4\'d9指的是用四位二進制數表示 ...… 查看全部問答∨ |
|
wince 5下能否通過USB device實現標準的U盤? 開發的wince 5設備有USB device,現在已經可以通過active sync來和Winxp PC實現同步。 但是感覺這個sync功能太強了,不希望用戶能查看所有的wince文件。僅僅需要實現U盤的功能就可以了 就是通過usb device連接PC,用戶僅僅看到一個U盤,可以讀寫 ...… 查看全部問答∨ |
|
我從網上下載了USBOOT工具和MAXDOS(中文版),在XP系統下制作了USB引導盤(U盤是KingSton),然后去引導VIA 的 EPIA CN(X86架構)班子,在CMOS中已經設定為USB-FDD啟動,可是總是起不來,到了Verifying DMI Pool.............就停止了。 不知道什 ...… 查看全部問答∨ |
|