NY8B062D提供 11+1 通道 12 位ADC模数转换器。 可将模拟信号转换为 12 位数字。
参考电压:外部PA0输入或者内部VDD,4V,3V,2V提供,根据采样电压的范围选取;
模拟输入通道:外部输入通道PA0~PA4PB0~PB5 ,内部可选择1/4 VDD
ADC操作顺序
依序设定:
①-ADC时钟(ADCLK),
②-ADC采样时间,
③- ADC位数,
④-ADC参考电压(寄存器ADVREFH),
⑤-选择模拟输入通道并将寄存器PACON相应位设置为 1,
⑥-再将GCHS位(寄存器ADMD[4]) 与ADEN位(寄存器ADMD[7])
设置为 1。
⑦-在ADEN设置为 1 后必须等待 256us(ADC电路启动时间),
⑧-再将START位(寄存器ADMD[6]) 写 1 来启动ADC模数转换。
⑨- ADC转换尚未完成时, 读取EOC位(寄存器ADMD[5]) 会得到 0。当ADC模数转换完成后会自动将EOC位设置为 1
代码如下:
//----- Initial ADC-----
ADMD = C_ADC_En | C_ADC_CH_Dis | C_ADC_PA0 ; //ADC使能,关闭所有输入通道,选择PA0作为模拟输入通道
ADVREFH = C_Vrefh_VDD; //选择参考电压为VDD
ADR = C_Ckl_Div8; //选择ADC时钟 = Fcpu/8
ADCR = C_Sample_1clk | C_12BIT; //选择ADC采样时间和ADC位数
PACON = C_PA0_AIN0; //选择PA0仅作为ADC模拟输入引脚
ADMDbits.GCHS = 1; //将GCHS位设置为1
delay(50); //等待 256us(ADC电路启动时间)
//-----------------------
while(1)
{
R_AIN0_DATA=R_AIN0_DATA_LB = 0x00;
F_AIN0_Convert(8); // 进行8次ADC转换
R_AIN0_DATA <<= 4; // 将高八位数据左移4位
R_AIN0_DATA_LB &= 0xF0; // Only get Bit7~4
R_AIN0_DATA += R_AIN0_DATA_LB; // R_AIN0_DATA + R_AIN0_DATA_LB
R_AIN0_DATA >>=3; // R_AIN0_DATA 右移三位,相当于除以8
}
/----- Sub-Routine -----
void F_AIN0_Convert(char count)
{
char i;
ADMD = 0x90 | C_ADC_PA0; // 选择PA0作为模拟输入口
for(i=1;i<=count;i++)
{
ADMDbits.START = 1; // 开始ADC转换
F_wait_eoc(); // 等待ADC转换完成
R_AIN0_DATA_LB += ( 0x0F & ADR); //ADC低四位数据
R_AIN0_DATA += ADD; //ADC高八位数据
}
}
//-----------------------
void F_wait_eoc(void)
{
while(ADMDbits.EOC==0)
;
}
来源:CSDN
作者:Jack.Q
链接:https://blog.csdn.net/qq_35650127/article/details/103612167