AVR没有D/A,但可以用PWM来代替D/A,其实也可以用数字电位器来代替D/A输出,X9312是一个100点变化的数字电位器,完全可以作为D/A输出
/*-----------------------------------D/A部分 ---------------------------------*/
/*-----------------------------------------------------------*/
/* X9312滑动端上调函数(入口参数:UP=向上调整的步数,x选择芯片) */
/*-----------------------------------------------------------*/
void X9312_UP(unsigned char x,unsigned char step)
{ unsigned char i;
if(x=='A') IC3A_ON; //IC3A使能
if(x=='B') IC3B_ON; //IC3B使能
delay_us(1);
IC3X_DIRUP; //IC3x方向向上
delay_us(1);
for(i=step;i>0;i--)
{IC3X_H; //IC3x高电平
delay_us(1);
IC3X_L; //INC从高电平跳变到低电平,实现一次上调
delay_us(1);
}
if(x=='A') IC3A_OFF; //IC3A关闭
if(x=='B') IC3B_OFF; //IC3B关闭
delay_us(1);
IC3X_H;
delay_us(1);
if(x=='A') IC3A_OFF; //IC3A关闭
if(x=='B') IC3B_OFF; //IC3B关闭
delay_ms(10); //数字电位器操作结束必须延时10ms后采样结果才能正确
}
/*------------------------------------------------------------*/
/* X9312滑动端下调函数(入口参数OWN=向下调整的步数,x选择芯片)*/
/*------------------------------------------------------------*/
void X9312_DOWN(unsigned char x,unsigned char step)
{ unsigned char i;
if(x=='A') IC3A_ON; //IC3A使能
if(x=='B') IC3B_ON; //IC3B使能
delay_us(1);
IC3X_DIRDN; //IC3x方向向上
delay_us(1);
for(i=step;i>0;i--)
{IC3X_H; //IC3x高电平
delay_us(1);
IC3X_L; //INC从高电平跳变到低电平,实现一次上调
delay_us(1);
}
if(x=='A') IC3A_OFF; //IC3A关闭
if(x=='B') IC3B_OFF; //IC3B关闭
delay_us(1);
IC3X_H;
delay_us(1);
if(x=='A') IC3A_OFF; //IC3A关闭
if(x=='B') IC3B_OFF; //IC3B关闭
delay_ms(10); //数字电位器操作结束必须延时10ms后采样结果才能正确
}
/*---------------------------------------------------------*/
/* X9312_A存储滑动端位置函数 */
/*---------------------------------------------------------*/
void X9312_SAVE()
{CLI();
IC3X_H; //IC3x高电平
delay_us(100);
IC3A_ON; //IC3A使能
delay_us(100);
IC3A_OFF; //CS从低到高的跳变,实现存储功能.
delay_ms(500);
SEI();
}
|