本帖最后由 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;
}
}
|