/*********************************************************
*Copyright (C), 2021, Shanghai Eastsoft Microelectronics Co., Ltd.
*文件名: adc
*作 者: AE Team
*版 本: V1.0
*日 期: 2021/12/08
*描 述: ADC程序例程
1.使用ES7P2131芯片的ADC模块,采用查询方式实现对模拟输入电压的数字量转换。ADC转换包括采样和转换两个过程。
2.本例程实现对AIN0通道进行模数转换,测量的数字量保存在ADC_AIN0变量中。
*备 注: 适用于ES7P2131
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
**********************************************************/
#include <hic.h>
unsigned char g_adc_value_h;
unsigned char g_adc_value_l;
unsigned int ADC_Data; //AD转换结果
unsigned int ADC_AIN0[100]; //AIN3通道转换结果数组
unsigned char j;
/********************************************************
函数名: void ram_clear(void)
描 述: 通用RAM区清零子程序
输入值: 无
输出值: 无
返回值: 无
**********************************************************/
void ram_clear(void)
{
GIE = 0;
for(IAAH = 0; IAAH < 0x04; IAAH++)
{
for(IAAL = 0; IAAL < 0xFF; IAAL++)
{
IAD = 0x00;
}
IAD = 0x00;
//clr_wdt();
}
}
/*********************************************************
函数名: void convert_adc(void)
描 述: ADC转换程序
输入值: 无
输出值: 无
返回值: 无
**********************************************************/
void convert_adc(void)
{
ADTRG = 1;
while(ADTRG);
g_adc_value_h = ADCRH;
g_adc_value_l = ADCRL;
}
/*********************************************************
函数名: void main()
描 述: 主函数
输入值: 无
输出值: 无
返回值: 无
**********************************************************/
void main()
{
ram_clear(); //初始化RAM
PBS = 0x3F; //AIN4~9设置为模拟端口
PES = 0xF0; //AIN0~3设置为模拟端口
PBT = 0x3F; //AIN4~9设置为输入端口
PET = 0xF0; //AIN0~3设置为输入端口
ADCHS3 = 0; //选择AD模拟通道0
ADCHS2 = 0;
ADCHS1 = 0;
ADCHS0 = 0;
//SMPON = //采样软件控制位
SMPS = 1; //硬件采样使能
//ADTRG = //转换启动位
//ADEN = //ADC使能位
//ADCTL0 =
ADLPEN = 0; //高速高功耗模式
ADVREFNS = 0; //负参考源选择位 VSS
ADVREFPS = 0; //正参考源选择位 VDD
//ADVREFVS =
//ADBITSEL1 = 1; //转换值选择位 12位
//ADBITSEL0 = 1;
//ADCTL1 =
ADFM = 1; //结果低位对齐
ADCKS2 = 0; //转换时钟频率(Tadclk)选择位 8分频
ADCKS1 = 1;
ADCKS0 = 1;
ADST1 = 1; //采样时间选择位 8个时钟采样
ADST0 = 0;
//ADVREF_CHOPEN = //内部参考电压斩波器使能位
ADVREF_EN = 1; //内部参考电压模块使能位
//ADCTL2 =
ADEN = 1;
convert_adc(); //第1次转换值不准,需丢弃
convert_adc(); //第2次转换值不准,需丢弃
j = 0;
while (1)
{
__Asm CWDT; // 喂狗
convert_adc(); // 获得ADC转换值
ADC_Data = ((unsigned int)g_adc_value_h) << 8;
ADC_Data += g_adc_value_l;
ADC_AIN0[j] = ADC_Data;
j++;
if(j > 100)
{
j = 0;
}
}
}