世纪电源网社区logo
社区
Datasheet
标题
返回顶部
未解决

这个程序为什么在中断里占空比不正确,在MAIN里就正确呢

[复制链接]
查看: 6212 |回复: 2
1
fengbin
  • 积分:8821
  • |
  • 主题:69
  • |
  • 帖子:273
积分:8821
LV8
副总工程师
  • 2019-1-16 11:36:20
10问答币
这个程序为什么在中断里占空比不正确,在MAIN里就正确呢
#include <reg52.h>

sbit PWMOUT = P0^0;

unsigned char HighRH = 0;
unsigned char HighRL = 0;
unsigned char LowRH = 0;
unsigned char LowRL = 0;
void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();
void init_uart(void);

void main()
{
    unsigned int i;
    unsigned char tmp1;

    EA = 1;     //开总中断
    init_uart();
    while (1) ;
//        {
//                 ConfigPWM(500, 50);               //频率100Hz,占空比10%
//            for (i=0; i<40000; i++);
//                ConfigPWM(892.85, 80);               //频率100Hz,占空比10%
//            for (i=0; i<40000; i++);       
//       
//        }
}
void ConfigPWM(unsigned int fr, unsigned char dc)
{
        unsigned long tmp;
        unsigned int high, low;

        tmp = 11059200/12/fr;
        high = (tmp*dc)/100;
        low = tmp - high;
        high = 65536 - high + 12;
        low = 65536 - low + 12;
        HighRH = (unsigned char)(high >>8);
        HighRL = (unsigned char)high;
        LowRH = (unsigned char)(low >> 8);
        LowRL = (unsigned char)low;
        TMOD &= 0xF0;
        TMOD |= 0x01;
        TH0 = HighRH;
        TL0 = HighRL;
        ET0 = 1;
        TR0 = 1;
        PWMOUT = 1;
       
}
void ClosePWM()
{
        TR0 = 0;
        ET0 = 0;
        PWMOUT = 1;
}
void InterruptTimer0() interrupt 1
{
    if (PWMOUT == 1)  //当前输出为高电平时,装载低电平值并输出低电平
    {
        TH0 = LowRH;
        TL0 = LowRL;
        PWMOUT = 0;
    }
    else              //当前输出为低电平时,装载高电平值并输出高电平
    {
        TH0 = HighRH;
        TL0 = HighRL;
        PWMOUT = 1;
    }
}

void init_uart(void)
{
       SCON=0x50;        //REN=1允许串行接受状态,串口工作模式2               
           TMOD= 0x00;       //定时器1为模式0(16位自动重载)               
           AUXR=0X40;                 //开启1T模式
       TL1=(65535-(11059200/4/9600));    //设置波特率重装值
           TH1=(65535-(11059200/4/9600))>>8;
           TR1  = 1;        //开启定时器1  
           ES   = 1;        //开串口中断     
}
void uart_int(void) interrupt 4 using 1
{
        unsigned char tmp1;
        unsigned int i;   
        if (RI)
    {
       tmp1 = SBUF;
           if(tmp1==0x8A)                                                 //收到的数据为0x15
           {             
                      RI = 0;
               ES= 0;                                                    //关闭串口中断  
                   ConfigPWM(500, 50);               //频率100Hz,占空比10%
               for (i=0; i<40000; i++);
                   ES= 1;
           }
           else if(tmp1==0x8B)
           {             
                      RI = 0;
               ES= 0;                                                    //关闭串口中断  
                   ConfigPWM(892.85, 80);               //频率100Hz,占空比10%
               for (i=0; i<40000; i++);
                   ES= 1;
           }
    }
}  

收藏收藏
liushiming82
  • 积分:4043
  • |
  • 主题:25
  • |
  • 帖子:253
积分:4043
LV8
副总工程师
  • 2019-1-17 09:26:53
  • 倒数2
 
在定时器中断中占空比不正确是正常的,因为你定时器中断的时间会打断占空比的时间

评分

参与人数 121币 +5收起理由
世纪电源网-九天 + 5

查看全部评分

wangdongchun
  • 积分:41127
  • |
  • 主题:751
  • |
  • 帖子:6831
积分:41127
LV12
专家
最新回复
  • 2019-1-17 12:45:11
  • 倒数1
 
恐怕楼主程序当中有跳转或者中断源,干扰到PWM发生

评分

参与人数 121币 +5收起理由
世纪电源网-九天 + 5

查看全部评分

热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号