打印
[STM8]

控制STM8的PWM波形

[复制链接]
5047|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这个是bit 1
这个是bit 0
我想要实现一个占空比是50%的PWM方波,频率大概是850KHz左右,从上图可以看到,8PWM方波代表一个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;
   }
}
沙发
airwill| | 2014-6-17 18:59 | 只看该作者
8组PWM方波代表一个bit。其实可以理解成:先高再低的代表bit1,先低再高的代表bit0。

我觉得这个方案有问题,  PWM 波总是高低间隔的, 先高再低还是先低再高, 还取决于上次 PWM 波形结束时的状态; 8组PWM方波代表一个bit, 这样的效率也太低了!
可以换个方案, 比如以 1/3 占空比表示0, 2/3 占空比表示1, 一个波形就代表一个bit. 如果检测占空比软件处理困难,
或者用频率调制, 5uS 的脉冲表示0, 10uS 的脉冲表示1, 一个脉冲就是一个bit...
还有更多的方案, 另外你还得考虑增加同步头, 结尾, 或许还应再考虑增加校验机制. 这都是上面的协议问题了.

使用特权

评论回复
板凳
电子云图| | 2014-6-17 19:23 | 只看该作者
你这是要传数据还是做互补的PWM?

使用特权

评论回复
地板
电子云图| | 2014-6-17 19:23 | 只看该作者
你这是要传数据还是做互补的PWM?

使用特权

评论回复
5
hjq451506709| | 2014-6-17 19:54 | 只看该作者
采用类似红外遥控的NEC或RC5那种数据调制方式.

使用特权

评论回复
6
lyzjimmy|  楼主 | 2014-6-18 08:51 | 只看该作者
电子云图 发表于 2014-6-17 19:23
你这是要传数据还是做互补的PWM?

我这是在传输数据的8组PWM代表的是一个bit,如何代表的bit0,或者bit1都在帖子上的图中有说到。

使用特权

评论回复
7
lyzjimmy|  楼主 | 2014-6-18 08:54 | 只看该作者
hjq451506709 发表于 2014-6-17 19:54
采用类似红外遥控的NEC或RC5那种数据调制方式.

对的,类似的数据调制方式,我现在不怎么懂用ST的单片机去输出应答,求解释啊

使用特权

评论回复
8
lyzjimmy|  楼主 | 2014-6-18 08:55 | 只看该作者
airwill 发表于 2014-6-17 18:59
8组PWM方波代表一个bit。其实可以理解成:先高再低的代表bit1,先低再高的代表bit0。

我觉得这个方案有问 ...

这是一种协议格式来的,协议规定是这样子,不是我认为规定的,我现在是要模拟输出波形,有什么好办法么?

使用特权

评论回复
9
lyzjimmy|  楼主 | 2014-6-18 15:50 | 只看该作者
难道就没有人知道么?

使用特权

评论回复
10
airwill| | 2014-6-18 17:34 | 只看该作者
理论上可以实现的, 但是你得解决这个问题:
PWM 波总是高低间隔的, 先高再低还是先低再高, 还取决于上次 PWM 波形结束时的状态;
比如现在端口已经是高电平状态,  怎么再输出先高再低的波形?  

使用特权

评论回复
11
lyzjimmy|  楼主 | 2014-6-18 18:02 | 只看该作者
airwill 发表于 2014-6-18 17:34
理论上可以实现的, 但是你得解决这个问题:
PWM 波总是高低间隔的, 先高再低还是先低再高, 还取决于上次 PW ...

其实换一个说吧,我只要知道一个周期的PWM如何去控制他先低再高还是先高再低就好办了,然后我就可以通过计数去控制我想要bit0还是bit1了,求指教啊,现在完全没思路,做不下去啊!

使用特权

评论回复
12
lyzjimmy|  楼主 | 2014-6-18 18:04 | 只看该作者
airwill 发表于 2014-6-18 17:34
理论上可以实现的, 但是你得解决这个问题:
PWM 波总是高低间隔的, 先高再低还是先低再高, 还取决于上次 PW ...

可以的话加一下我QQ一起探讨一下,QQ:327454993,说明是版主大神就可以

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

15

帖子

0

粉丝