打印

麻烦帮忙看看这个PWM占空比可调的程序哪里出了问题,谢谢

[复制链接]
2873|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
南泉|  楼主 | 2010-9-4 12:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
麻烦大家帮忙看看这个程序哪里出了问题,用的是89S52调试,晶振是11.0592M,为什么示波器上的频率是343Hz呢,按键时数值会变化,但是占空比却没有改变,是哪里出了问题呢?

#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

uchar count=0;
uchar pwm=50;   

sbit p10=P1^0;  //pwm output
sbit p32=P3^2;  //pwm +
sbit p33=P3^3;  //pwm -

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //数码管显示

void Time0_init(void)  //定时0.01ms
{
        TR0=0;
        TMOD=0X01;
        TH0=0xFF;
        TL0=0xF6;       
        TR0=1;
        ET0=1;
        EA=1;
}

void TimeO_int ()interrupt 1
{
        TH0=0XFF;
        TL0=0XF6;
                count++;
        if(count>=100)        count=0;
       
}

void delay(uint del)  //延时,按键延时用
{
        uint i,j;
        for(i=0; i<del; i++)
        for(j=0; j<60; j++)   
        ;
}


void main()
{
        Time0_init();
        p10=0;
        while(1)
        {
        P0=table[pwm/10];   //数码管显示
        P2=0x00;
        delay(1);
        P0=table[pwm%10];
        P2=0X01;
        delay(1);   
   
        if(p32==0)        //pwm +
        {
        delay(20);
        if(p32==0) pwm++;
        }

        if(p33==0)       //pwm -
        {
        delay(20);
        if(p33==0) pwm--;
        }
       
        if(pwm>=100)pwm=100;  //0-100 PWM control
        if(pwm<=0)pwm=0;

        if(count<=pwm)  p10=1;
        else p10=0;

        };
}

相关帖子

沙发
原野之狼| | 2010-9-4 13:25 | 只看该作者
main函数delay了 怎么可能会准呢

使用特权

评论回复
板凳
不亦心| | 2010-9-4 13:52 | 只看该作者
本帖最后由 不亦心 于 2010-9-4 18:09 编辑

进出中断也要耗时啊,没有软件修正,频率肯定不准了
至于占空比为什么不会变,你数码管显示要延时,可能在这段延时期间,count猛加导致的(猜测而已),你可以是把if(count<=pwm)  p10=1;else p10=0;放到中断程序里再试一下

使用特权

评论回复
地板
原野之狼| | 2010-9-4 14:04 | 只看该作者
拿张纸 在时间轴上划一下 看一下要多长时间才能改变P10的状态
期间都经历了哪些过程 耗时分别是多少

使用特权

评论回复
5
南泉|  楼主 | 2010-9-6 10:33 | 只看该作者
3# 不亦心

今天把数码管显示和占空比调节都屏蔽掉,将if(count<=30)p10=1;else p10=0;放到中断内,占空比是没错,但是频率282.5Hz也不对,不知道是什么原因,现在也就只有中断程序了。

使用特权

评论回复
6
南泉|  楼主 | 2010-9-6 10:37 | 只看该作者
/*晶振11.0592M,定时0.01ms,周期1ms,p1.0输出pwm信号,p3.2pwm增加,p3.3pwm减小*/

#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int

uchar count=0;

sbit p10=P0^0;   


void Time0_init(void)  //定时0.01ms
{
        TR0=0;
        TMOD=0X01;
        TH0=0xFF;
        TL0=0xF6;       
        TR0=1;
        ET0=1;
        EA=1;
}

void TimeO_int ()interrupt 1
{
       
        TH0=0XFF;
        TL0=0XF6;
                count++;

        if(count<=30)  p10=1;
        else p10=0;

        if(count>=100)        count=0;
       
}

void main()
{
        Time0_init();
        p10=0;
        while(1)
        {}
}

这样的程序频率变为282.5Hz,怎么不会是1KHz呢?

使用特权

评论回复
7
zjswuyunbo| | 2010-9-6 14:06 | 只看该作者
你的程序是10us中断一次?51做不到这么快!中断的临时变量保护和你的中断代码远远超出10us,改为100us估计就准了

使用特权

评论回复
8
不亦心| | 2010-9-6 17:37 | 只看该作者
如7楼所言,
你可以用软件调试一下,看看进入中断到退出中断要耗时多少,你这段中断服务程序耗时大于10us,那么上次中断尚未退出,新的中断又来了……


5# 南泉

使用特权

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

本版积分规则

5

主题

22

帖子

1

粉丝