在stm8-discovery板上 如何实现呼吸灯的效果,pwm程序如下,请指教,谢谢! ------------------------------------------------------------------------------------------------------------------ #include"iostm8l152c6.h" #include"stdint.h" //这个头文件定义了数据类型,可以使用uint8_t,uint16_t void DelayMS(unsigned int ms) { uint8_t i; while(ms != 0) { for(i=0;i<250;i++); for(i=0;i<75;i++); ms--; } } /**************************************************************************************** * 名 称:void TIMER1_Init(void) * 功 能:stm8定时器初始化 * 入口参数:无 * 出口参数:无 * 说 明:通道1输出pwm波 * 范 例:无 ****************************************************************************************/ void TIMER1_Init(void) { //对于stm8l,默认时钟源是关闭的,需要先打开,才能配置寄存器 CLK_PCKENR2_PCKEN21=1;//打开定时器1时钟 TIM1_CCMR1_OC1M=0x06;//0b110 PWM模式1 TIM1_CCER1_CC1P=0;//高电平有效 TIM1_CCER1_CC1E=1;//OC1信号输出到对应引脚,PD2为OC1输出引脚 //禁用预装载寄存器,TIM1CCR can be wiriten at any time TIM1_CCMR1_OC1PE=0; TIM1_CR1_CMS=0;//计数器计数方向取决于TIM1_CR1_DIR TIM1_CR1_DIR=0;//counter used as up-counter //初始化刹车寄存器中的MOE,只有设置此位才能使TIM1的OC1输出pwm TIM1_BKR_MOE=1; TIM1_PSCRH = 0;// Set the Prescaler value TIM1_PSCRL = 0;// Set the Prescaler value TIM1_ARRH = 0;// 初始化自动装载寄存器,决定PWM 方波的频率 TIM1_ARRL = 256;// 初始化自动装载寄存器,决定PWM 方波的频率 TIM1_CCR1H=0; TIM1_CCR1L=0; TIM1_CR1_CEN=1;//开启计数器 } int main( void ) { uint8_t i; //CLK_CKDIVR寄存器默认0x03分频值为8,所以主频默认为16M/8=2M //PD2引脚输出PWM波 PD_DDR_DDR2 =1;//设置为输出 PD_CR1_C12 =1;//推挽输出 TIMER1_Init(); while(1) { // 下面的循环将占空比逐渐从0 递增到50% for(i=0;i<128;i++) { TIM1_CCR1H = 0; TIM1_CCR1L = i; DelayMS(600); } // 下面的循环将占空比逐渐从50%递减到0 for(i=128;i>0;i--) { TIM1_CCR1H = 0; TIM1_CCR1L = i; DelayMS(600); } } } |
再调节占空比就好了
DAC输出【PWM对电容充电也可以实现】
电容充电我觉得玄乎,放电时候不一定均匀还要算好充电时间