STM8S PWM 應用 呼吸燈

//主功能接受:使用MCU STM8S105C6 的PWM通道2 PC2 來做呼吸燈 已經驗證OK,呵

//呵,這個PWM設置剛開始用還是有點麻煩,因爲是自己摸索,花點時間,還是攻克了

。
//所用子函數都是調用STM8S的庫函數stm8s_tim.c 中的。
宏定義:
//分頻宏
//計數器的時鐘頻率(fCK_CNT)等於fCK_PSC/( PSCR[15:0]+1)。
#define  TIM1_PRESCALER_1    ((u16)0x00)
#define  TIM1_PRESCALER_2    ((u16)0x01)
#define  TIM1_PRESCALER_3    ((u16)0x02)
#define  TIM1_PRESCALER_4    ((u16)0x03)
#define  TIM1_PRESCALER_5    ((u16)0x04)


// PWM 頻率設定
#define MDIV2
//16M 2分頻的設置
#if defined(MDIV2)
#define TIM1_DIV_SET TIM1_DIV2
#define	PWMFRE_8KHZ  1000//主頻率 16M/2=8M 1/8K=1/8M*1000 週期 0.125us
#define	PWMFRE_4KHZ  2000
#define	PWMFRE_2KHZ  4000
#define	PWMFRE_1KHZ  8000
#define	PWMFRE_05KHZ  16000
#define	PWMFRE_025KHZ  32000
#define	PWMFRE_020KHZ  40000//200HZ 週期5000us /0.125 =40000
#define	PWMFRE_38KHZ  210//用於紅外38KHZ載波
#define	PWMFRE_OPEN   70//1/3的PWM佔空比
#else
//16M 不分頻的設置
#define TIM1_DIV_SET TIM1_DIV1
#define	PWMFRE_8KHZ  2000
//1/8K=1/16M*2000
#define	PWMFRE_4KHZ  4000
#define	PWMFRE_2KHZ  8000
#define	PWMFRE_1KHZ  16000
#define	PWMFRE_05KHZ  32000
#define	PWMFRE_025kHZ  64000
#define	PWMFRE_38KHZ  421//用於紅外38KHZ載波
#define	PWMFRE_OPEN   140//1/3的PWM佔空比
#endif
//初始化調用:

TIM1_PrescalerConfig(TIM1_PRESCALER_2,TIM1_PSCRELOADMODE_IMMEDIATE);
//1分頻即不分配 允許事件更新
TIM1_OC2Init

(TIM1_OCMODE_PWM1,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_ENABLE,
             0,TIM1_OCPOLARITY_LOW,TIM1_OCNPOLARITY_HIGH,
             TIM1_OCIDLESTATE_SET,TIM1_OCNIDLESTATE_SET);
//PWM1模式 

TIM1_CounterModeConfig(TIM1_COUNTERMODE_UP);//向上計數模式
TIM1_ARRPreloadConfig(ENABLE);//重新預裝載使能
TIM1_OC2PreloadConfig(ENABLE);//比較器2預狀態使能


TIM1_SetCounter(0);//初始化計數值
TIM1_SetAutoreload(PWMFRE_020KHZ);//0.125us週期 40*0.125=5us 200khz 週期

是5us 5/0.125
TIM1_SetCompare2(0);//佔空比值

TIM1_CtrlPWMOutputs(ENABLE);//PWM控制使能
TIM1_Cmd(ENABLE);//使能TIM1計數
TIM1_CCxNCmd(TIM1_CHANNEL_2,ENABLE);//第二通道 輸出使能

//主程序調用(10ms執行1次):

//更改佔空比

	 if(F_ADD)
         {
            PWMVal += 100;
            if( PWMVal >= 2000)
            {
             
              F_ADD = 0;
              
            }
         }
         else
         {
            PWMVal -= 100;
            if( PWMVal <= 100)
            {
             
                F_ADD = 1;
              
            }
         }
          TIM1_SetCompare2(PWMVal);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章