ADCx_CFG(x=1~2) 配置寄存器
OVWREN (bit16):数据复写使能位,为 1 的时候使能复写功能,为 0 的时候关闭复写功能。 AVGS(bit15:14):硬件平均次数,只有当 ADC1_GC 寄存器的 AVGE 位为 1 的时候才有效
ADTRG(bit13):转换触发选择。为 0 的时候选择软件触发,为 1 的时候,不选择软件触发。 REFSEL(bit12:11):参考电压选择,为 00 时选择 VREFH/VREFL 这两个引脚上的电压为参考电压,正点原子 ALPHA 开发板上 VREFH 为 3.3V,VREFL 为 0V。 ADHSC(bit10):高速转换使能位,当为 0 时为正常模式,为 1 时为高速模式。 ADSTS(bit9:8):设置 ADC 的采样周期,与 ADLSMP 位一起决定采样周期:
ADLSMP(bit4):长采样周期使能位,当值为 0 时为短采样周期模式,为 1 时为长采样周期模式。搭配 ADSTS 位一起控制 ADC 的采样周期。 MODE(bit3:2):选择转换精度:
ADICLK(bit1:0):输入时钟源选择,为 00 的时候选择 IPG Clock,为 01 的时候选择 IPG Clock/2,为 10 的时候无效,为 11 的时候选择呢 ADACK。本教程我们设置为 11,也就是选择ADACK 为 ADC 的时钟源。
ADCx_GC 通用控制寄存器
CAL(bit7):当该位写入 1 时,硬件校准功能将会启动,校准过程中该位会一直保持 1,校准完成后会清 0,校准完成后需要检查一下ADC_GS[CALF]位,确认校准结果。 ADCO(bit6):连续转换使能位,只有在开启了硬件平均功能时有效,为 0 时只能转换一次或一组,当 ADCO 为 1 时可以连续转换或多组。 AVGE(bit5):硬件平均使能位。为 0 时关闭,为 1 时使能。 ACFE(bit4):比较功能使能位。为 0 时关闭,为 1 时使能。 ACFGT(bit3):配置比较方法,如果为 0 的话就比较转换结果是否小于 ADC_CV 寄存器值,如果为 1 的话就比较装换结果是否大于或等于 ADC_CV 寄存器值。 ACREN(bit2):范围比较功能使能位。为 0 的话仅和 ADC_CV 里的 CV1 比较,为 1 的话和 ADC_CV 里的 CV1、CV2 比较。 ACREN(bit2):范围比较功能使能位。为 0 的话仅和 ADC_CV 里的 CV1 比较,为 1 的话和 ADC_CV 里的 CV1、CV2 比较。 DMAEN(bit1):DMA 功能使能位,为 0 是关闭,为 1 是开启 ADACKEN(bit0):异步时钟输出使能位,为 0 是关闭,为 1 时开启
ADCx_GS 通用状态寄存器
AWKST(bit2):异步唤醒中断状态,为 1 时表示发生了异步唤醒中断。为 0 时没有发生异步中断。 CALF(bit1):校准失败标志位,为 0 的时候表示校准正常完成,为 1 的时候表示校准失败。 ADACT(bit0):转换活动标志,为 0 的时候表示转换没有进行,为 1 的时候表示正在进行转换。
ADCx_HS 状态寄存器(COCO0表示转换完成)
COCO0(bit0):每次转换完成此位就会被置 1。
ADCx_HC0 控制寄存器
AIEN(bit7):转换完成中断控制位,为 1 的时候打开转换完成中断,为 0 的时候关闭。 ADCH(bit4:0):转换通道选择,可以设置为 00000~01111 分别对应通道 0~15。11001 为内部通道,用于 ADC 自测。
ADCx_R0 数据寄存器
流程代码
1、初始化 ADC1_CH1
//初始化 ADC1_CH1,配置 ADC 位数,时钟源,采样时间等。
2、校准 ADC
//ADC 在使用之前需要校准一次。
3、使能 ADC
//配置好 ADC 以后就可以开启了。
4、读取 ADC 值
//ADC 正常工作以后就可以读取 ADC 值。
初始化和使能
void adc1ch1_init(void) {
ADC1->CFG = 0;
ADC1->CFG |= (2 << 2) | (3 << 0);
ADC1->GC = 0;
ADC1->GC |= 1 << 0;
}
/ CFG寄存器 * bit16 0 关闭复写功能 * bit15:14 00 硬件平均设置为默认值,00的时候4次平均, * 但是得ADC_GC寄存器的AVGE位置1来使能硬件平均 * bit13 0 软件触发 * bit12:1 00 参考电压为VREFH/VREFL,也就是3.3V/0V * bit10 0 正常转换速度 * bit9:8 00 采样时间2/12,ADLSMP=0(短采样)的时候为2个周期 * ADLSMP=1(长采样)的时候为12个周期 * bit7 0 非低功耗模式 * bit6:5 00 ADC时钟源1分频 * bit4 0 短采样 * bit3:2 10 12位ADC * bit1:0 11 ADC时钟源选择ADACK / / GC寄存器 * bit7 0 先关闭校准功能,后面会校准 * bit6 0 关闭持续转换 * bit5 0 关闭硬件平均功能 * bit4 0 关闭比较功能 * bit3 0 关闭比较的Greater Than功能 * bit2 0 关闭比较的Range功能 * bit1 0 关闭DMA * bit0 1 使能ADACK /
自动校准
status_t adc1_autocalibration(void) {
status_t ret = kStatus_Success;
ADC1->GS |= (1 << 2); /* 清除CALF位,写1清零 */
ADC1->GC |= (1 << 7); /* 使能校准功能 */
/* 校准完成之前GC寄存器的CAL位会一直为1,直到校准完成此位自动清零 */
while((ADC1->GC & (1 << 7)) != 0) {
/* 如果GS寄存器的CALF位为1的话表示校准失败 */
if((ADC1->GS & (1 << 2)) != 0) {
ret = kStatus_Fail;
break;
}
}
/* 校准成功以后HS寄存器的COCO0位会置1 */
if((ADC1->HS & (1 << 0)) == 0)
ret = kStatus_Fail;
/* 如果GS寄存器的CALF位为1的话表示校准失败 */
if((ADC1->GS & (1 << 2)) != 0)
ret = kStatus_Fail;
return ret;
}
获取ADC原始值
unsigned int getadc_value(void) {
/* 配置ADC通道1 */
ADC1->HC[0] = 0; /* 关闭转换结束中断 */
ADC1->HC[0] |= (1 << 0); /* 通道1 */
while((ADC1->HS & (1 << 0)) == 0); /* 等待转换完成 */
return ADC1->R[0]; /* 返回ADC值 */
}
获取ADC原始值(多次取平均)
unsigned short getadc_average(unsigned char times)
{
unsigned int temp_val = 0;
unsigned char t;
for(t = 0; t < times; t++){
temp_val += getadc_value();
delayms(5);
}
return temp_val / times;
}
获取模数转换后的电压
由于精度为12 bit, ADC范围为[0, 4095]。同时电压满输出时为3.3v,因此当ADC数据拉满,得到3300mv,也就是3.3v
unsigned short getadc_volt(void)
{
unsigned int adcvalue=0;
unsigned int ret = 0;
adcvalue = getadc_average(5);
ret = (float)adcvalue * (3300.0f / 4096.0f); /* 获取计算后的带小数的实际电压值 */
return ret;
}
上一篇:通用裸机-arm汇编和cpu运行模式
下一篇:IMX6ULL裸机-3.1-SPI应用-6轴陀螺仪加速度传感器ICM-20608-G
推荐阅读最新更新时间:2024-11-05 14:22
设计资源 培训 开发板 精华推荐
- 使用 Diodes Incorporated 的 AZ7042ZTR-E1 的参考设计
- 使用 ROHM Semiconductor 的 BD49E58G-TR 的参考设计
- LTC1560-1 的典型应用 - 1MHz/500kHz 连续时间低噪声、低通椭圆滤波器
- AM2LS-0512S-NZ 12V 2W DC-DC 转换器的典型应用
- LTC7149EUFD 24V 输入并发 ±12V 电源的典型应用电路
- LTC6990CS6#TRMPBF 过压检测器/警报的典型应用。压电报警器直接驱动
- LA5779他激式降压型开关稳压器典型应用(变量型)
- TPA3116功放
- OP297FSZ-REEL7 精密正峰值检波器的典型应用
- LTC3838IUHF-1 4.5V 至 14V 输入、3.3V/25A 输出、2MHz、RSENSE、降压转换器的典型应用电路