打印
[STC单片机]

STC15F2K60S2用PWM模拟输出DA有一小段输出不对,有谁遇到过这...

[复制链接]
1643|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yiyetianfang 于 2017-1-10 09:00 编辑

STC15F2K60S2用PWM模拟输出DA有一小段输出不对,PWM值在32-5968之间,总的是6000.PWM值在5949-5967输出不对,输出电压在2.52-3.2V。其他的值都对,pwm值在5968-6000(大于5968,就强制等于5968)直接也输出正常。

#define     PWM_DUTY        6000            

#define     PWM_HIGH_MIN    32              //限制PWM输出的最小占空比。用户请勿修改。
#define     PWM_HIGH_MAX    (PWM_DUTY-PWM_HIGH_MIN) //限制PWM输出的最大占空比。用户请勿修改。

void DAC_init();
void LoadPWM(u16 i);





u16     PWM_high,PWM_low;   //中间变量,用户请勿修改。
sbit    P_PWM = P3^5;       //定义PWM输出引脚。


void DAC_init()
{
         
          P_PWM = 0;
    P3M1 &= ~(1 << 5);  //P3.5 设置为推挽输出
    P3M0 |=  (1 << 5);



    TR0 = 0;        //停止计数
    ET0 = 1;        //允许中断
    PT0 = 1;        //高优先级中断
    TMOD &= ~0x03;  //工作模式,0: 16位自动重装
    AUXR |=  0x80;  //1T
    TMOD &= ~0x04;  //定时
    INT_CLKO |=  0x01;  //输出时钟

    TH0 = 0;
    TL0 = 0;
    TR0 = 1;    //开始运行

    EA = 1;
}


/**************** 计算PWM重装值函数 *******************/
void    LoadPWM(u16 i)
{
    u16 j;

    if(i > PWM_HIGH_MAX)        i = PWM_HIGH_MAX;   //如果写入大于最大占空比数据,则强制为最大占空比。
    if(i < PWM_HIGH_MIN)        i = PWM_HIGH_MIN;   //如果写入小于最小占空比数据,则强制为最小占空比。
    j = 65536UL - PWM_DUTY + i; //计算PWM低电平时间
    i = 65536UL - i;            //计算PWM高电平时间
    EA = 0;
    PWM_high = i;   //装载PWM高电平时间
    PWM_low  = j;   //装载PWM低电平时间
    EA = 1;
}

/********************* Timer0中断函数************************/
void timer0_int (void) interrupt 1   //每次电平变化,中断进入赋值下一个电平的时间
{
    if(P_PWM)
    {
        TH0 = (u8)(PWM_low >> 8);   //如果是输出高电平,则装载低电平时间。
        TL0 = (u8)PWM_low;
    }
    else
    {
        TH0 = (u8)(PWM_high >> 8);  //如果是输出低电平,则装载高电平时间。
        TL0 = (u8)PWM_high;
    }
}

原理图.jpg (177.68 KB )

原理图.jpg

相关帖子

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

本版积分规则

5

主题

26

帖子

0

粉丝