打印
[51单片机]

C8051F040---请教关于PWM填充

[复制链接]
629|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 心印菩提 于 2015-8-10 20:44 编辑

找到了问题所在,让我来终结这个帖子吧



如图,实际比较器由ECOMn和PWMn共同使能
因此把CR = ~CR修改一下就可以了
但是事实使用时有一点不一样
ECOMn禁止后,输出为低
PWMn禁止后,输出为高
就这样

==============================================================
写这个程序的目的是准备给无刷直流电机提供驱动信号
需要的是给一个低频方波信号里面填充较高频率的PWM波
思路是设置好PCA的寄存器,包括PWM的占空比和频率
然后用定时器0来控制CR,即PCA0CN 寄存器的第6位,周期性的使能和禁止PWM输出,实现PWM的填充
产生类似调制波一样的波形

大概程序如下:
void PCA0_Init (void)
{
   char SFRPAGE_save = SFRPAGE;        // Save current SFR Page

   SFRPAGE = PCA0_PAGE;
   // configure PCA time base; overflow interrupt disabled
   PCA0CN = 0x00;                      // Stop counter; clear all flags
   PCA0MD = 0x00;                      // Use SYSCLK as time base

   PCA0CPM0 = 0x42;                    // Module 0 = 8-bit PWM mode

   // Configure initial PWM duty cycle = 50%
   PCA0CPH0 = 256 - (256 * 0.2);

   // Start PCA counter
   CR = 1;
   SFRPAGE = SFRPAGE_save;
}

void Timer_Init()
{
        char SFRPAGE_SAVE = SFRPAGE;
        SFRPAGE   = TIMER01_PAGE;
        TMOD      = 0x01;
         TH0       = 0xF4;
        TL0       = 0x00;
        EA=1;                                                //总中断开
        TR0=1;                                                //定时方式
        ET0=1;
        SFRPAGE = SFRPAGE_SAVE;
}

void Timer0_ISR(void) interrupt 1
{
           char SFRPAGE_SAVE = SFRPAGE;
        SFRPAGE = TIMER01_PAGE;
        TH0       = 0xF4;
        TL0       = 0x00;
        SFRPAGE = PCA0_PAGE;        
        CR = ~CR;

        SFRPAGE = SFRPAGE_SAVE;
}




本来希望得到的是第三张图一样的波形,没有PWM的部分为低电平
但是输出在图1和图3之间不断的跳变,有时没有PWM的部分为高,有时为低,感觉不受控
请问这个问题出在哪儿
我试过在中断里直接 CR = 0 ,输出是恒低的
非常感谢

相关帖子

沙发
ningling_21| | 2015-8-6 14:28 | 只看该作者
通过程序控制那个输出的管脚,使在无PWM输出时输出低电平

使用特权

评论回复
板凳
心印菩提|  楼主 | 2015-8-6 16:29 | 只看该作者
本帖最后由 心印菩提 于 2015-8-6 16:39 编辑

按照你的思路把中断服务函数做了修改

void Timer0_ISR(void) interrupt 1
{
           char SFRPAGE_SAVE = SFRPAGE;
        SFRPAGE = TIMER01_PAGE;
        TH0       = 0xF4;
        TL0       = 0x00;
        SFRPAGE = PCA0_PAGE;        
        CR = ~CR;

        
        if(CR == 0)
        {
                SFRPAGE = CONFIG_PAGE;
                XBR0 = 0x00;                P0MDOUT = 0xFF;
                P0 &= 0xFE;

                XBR0 = 0x08;
        }

        SFRPAGE = SFRPAGE_SAVE;
}

但是并没有什么作用,还是老样子
没有PWM的时候时高时低


使用特权

评论回复
地板
nyf1972| | 2015-8-7 14:23 | 只看该作者
问问楼主,C8051F040 系列好像抗干扰很差,以前把我整惨了,现在是否有改善?

使用特权

评论回复
5
心印菩提|  楼主 | 2015-8-7 14:32 | 只看该作者
nyf1972 发表于 2015-8-7 14:23
问问楼主,C8051F040 系列好像抗干扰很差,以前把我整惨了,现在是否有改善? ...

你指的抗干扰差具体是什么呢

使用特权

评论回复
6
心印菩提|  楼主 | 2015-8-10 10:49 | 只看该作者
顶一发

使用特权

评论回复
7
nyf1972| | 2015-9-16 20:53 | 只看该作者
你做好后最好走一次EMC测试,我以前测试的结果是不能超过450v 群脉冲干扰 系统就死了,到后来直接 某些代码空间都给你清除掉了。我手里面020,040 还有200片, 都当废品扔了。后来改成其他的型号就没问题了,目前测试时 4000v 群脉冲干扰没有问题。

使用特权

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

本版积分规则

9

主题

39

帖子

0

粉丝