打印
[51单片机]

单片机的PWM输出死机

[复制链接]
1910|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mokedeng|  楼主 | 2014-5-18 23:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用STC的单片机输出一个17K的PWM波形。 我写了一个程序让PWM自己增加占空比。  PWM的输出是用来控制电机的转数的
但是在实验的过程中出现了一个问题
当我的单片机不带负载的时候占空比能自动的增加,不会出现问题。
但是当接上负载之后占空比增加了几秒钟之后就停止了,类似于死机的样子。当我把负载卸掉,占空比又能自动增加了
我查了一下单片机的拉电流是20ma

下面是我写的一个自动加减占空比的程序

        while (1)
        {
                if (signal == 1)
                {
                        if(pwm<2000)
                        {
                                pwm+=10;
                                PWM_SetHighReg(pwm);
                                write_pwm(11,pwm);
                                delay_ms(500);

                        }
                        else       
                                signal = 0;
                }
               
                else
                {
                        if(pwm>50)
                        {
                                pwm-=10;
                                PWM_SetHighReg(pwm);
                                write_pwm(11,pwm);
                                delay_ms(500);
                               
                        }
                        else       
                                signal = 1;
                }   



相关帖子

沙发
menfiss| | 2014-5-19 10:25 | 只看该作者
你的软件应该是开环的吧,不会受负载的影响。如果受影响了可能和硬件有关。

使用特权

评论回复
板凳
lanmp| | 2014-5-19 11:13 | 只看该作者
当我把负载卸掉,占空比又能自动增加了

这事说明带不动了吧

使用特权

评论回复
地板
mokedeng|  楼主 | 2014-5-20 14:42 | 只看该作者
menfiss 发表于 2014-5-19 10:25
你的软件应该是开环的吧,不会受负载的影响。如果受影响了可能和硬件有关。 ...

嗯 我也发现了是软件的影响  

使用特权

评论回复
5
mokedeng|  楼主 | 2014-5-20 14:50 | 只看该作者
menfiss 发表于 2014-5-19 10:25
你的软件应该是开环的吧,不会受负载的影响。如果受影响了可能和硬件有关。 ...

我试了一下是加上计数之后程序给跑飞了   我写了一段程序 麻烦你给我看看

/*====================================================================*/
/*函数:unit read()                             */
/*描述:读取计数值                                                     */
/*参数:无                                                            */
/*返回:无                                                            */
/*备注:无                                                            */
/*====================================================================*/
unsigned int read()
{
        unsigned char t1, th1, th2;
        unsigned int val;
        while(1)
        {
                th1 = TH0;
                t1 = TL0;
                th2 = TH0;
                if(th1==th2)
                        break;                 
        }
        val=th1*256+t1;
        return val;
}

这个是读出计数脉冲的次数

void t1(void) interrupt 3 using 0
{
        TF1 = 0;
        TH1 = 0x1C;
        TL1 = 0x22;   
        timecount++;
        if (timecount == 25)    //0.5s计时
        {
            TR1 = 0;   //关闭定时器1,为了读出计数器0计数个数
                timecount = 0;
                x = read();
                write_count(11,x);
                TH0 = 0;  //计数器初值清零
                TL0 = 0;                       
                TR0 = 1;  //重新启动计数器0
                TR1 = 1;
        }
       

}

这个是一个中断程序每隔0.5S读一次计数数据


我前面的程序还定义了一个PCA的中断
我用的是35M的晶振,  我用一个管脚发出来20KHZ的PWM,用P3.4再把他显示出来

就是不知道程序哪里出了问题









使用特权

评论回复
6
menfiss| | 2014-5-20 19:14 | 只看该作者
我还真没考虑软件,我说的开环,指的是系统的输出没有返回到系统输入,也就是没有反馈的意思。软件的反馈比硬件的反馈容易判断吧?其实我也是从首楼的描述这样判断的。如果开环系统还会受负载影响,差不多就是硬件导致的。
write_count(11,x);是改变led状态吗?

使用特权

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

本版积分规则

20

主题

38

帖子

0

粉丝