//主功能接受:使用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);
STM8S PWM 应用 呼吸灯,布布扣,bubuko.com
原文:http://blog.csdn.net/chuangwu2009/article/details/26354297