这个是bit 1
这个是bit 0
我想要实现一个占空比是50%的PWM方波,频率大概是850KHz左右,从上图可以看到,8组PWM方波代表一个bit。其实可以理解成:先高再低的代表bit1,先低再高的代表bit0。
现在我的程序可以实现了50%的PWM的方波,频率也对了,但是怎么定8组PWM跟怎么样先高再低,或者先低再高这样的暂时未能实现。
以下是我的程序,我是通过事件更新的方式去判断是否有产生了8次PWM事件,同时通过控制PWM 的mode 1或者0 来控制先高再低,或者是先低再高的跳变。
以上是我产生的先低再高的为一个周期的波形,通过与我设想的bit 0的波形比对,会发现有8组上升沿PWM产生,最后一个bit时候,PWM完成了信号发送,按理是一直置高的,为什么会清零了。以下是我的程序,这个问题烦扰了我好几天了,希望有人能解答,不胜感激啊。
或者有什么好的方案可以跟我说一下。我也是用过定时的方式去做IO模拟,但是定时的效果不理想,没个周期的误差大。
voidtim3_init(void) { TIM3_CR1=0x00;//0X86;//10000000;up-counter 最低位为计数器使能,暂时不使能; TIM3_IER=0x00;//-------------00000000B TIM3_SR1=0;//中断标志位清零 最低位为溢出中断标志位,软件清理 TIM3_SR2=0x00;//0;//中断标志位清零 TIM3_EGR=0x01;//0;//00000000 TIM3_CCMR1_COMPARE=0X70;//01111000 // 通道1被设置成比较输出方式 //PWM MODE2 IN_UP_COUNTING // 向上计数时,若计数器小于比较值,为无效电平 // 即当计数器在0到比较值时,输出为1,否则为0 --> 0x70 //3th bit is 使能TIM3_CCR1预装载功能 //1:0-->00:cc1通道被配置为输出 TIM3_CCER1=0X01;//CH1的OC1低电平有效,并且时OUTPUT TIM3_ARRH=0X00; TIM3_ARRL=0X12;//应答一个周期是1.2us,就是833KHZ,这就为PWM的频率 TIM3_CCR1H= 0; TIM3_CCR1L= 9; //半周期的时间,决定占空比 TIM3_PSCR=0x00;//预分频器;fck_cn=fck_psc除以2的PSC[3:0]次方 TIM3_IER=0x01;//允许更新事件 TIM3_BKR= 0xC0; //刹车 //TIM3_CR1|=0X01;//启动 } Void main (void) { Uint8_t i; tim3_init(); while(1) { TIM3_CNTRL=0X00; TIM3_SR1=0; TIM3_CR1|=0X01;//启动TIM3 for(i=0;i<8;i++) { TIM3_CCMR1_COMPARE=0X60;// '0'//TIM3_CCER1=0X03; while((TIM3_SR1&0x01)==0); TIM3_SR1=0; TEST_PIN; } TIM3_CR1&=0Xfe;//关闭TIM3 break; } }
|