首页 > 其他分享 >IMX6ULL ADC控制器

IMX6ULL ADC控制器

时间:2023-10-30 20:44:49浏览次数:29  
标签:采样 控制器 转换 校准 使能位 ADC 寄存器 IMX6ULL

ADCx_CFG(x=1~2) 配置寄存器

image
OVWREN (bit16):数据复写使能位,为 1 的时候使能复写功能,为 0 的时候关闭复写功能。
AVGS(bit15:14):硬件平均次数,只有当 ADC1_GC 寄存器的 AVGE 位为 1 的时候才有效
image
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 位一起决定采样周期:
image
image
ADLSMP(bit4):长采样周期使能位,当值为 0 时为短采样周期模式,为 1 时为长采样周期模式。搭配 ADSTS 位一起控制 ADC 的采样周期。
MODE(bit3:2):选择转换精度:
image
ADICLK(bit1:0):输入时钟源选择,为 00 的时候选择 IPG Clock,为 01 的时候选择 IPG Clock/2,为 10 的时候无效,为 11 的时候选择呢 ADACK。本教程我们设置为 11,也就是选择ADACK 为 ADC 的时钟源。

ADCx_GC 通用控制寄存器

image
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 通用状态寄存器

image
AWKST(bit2):异步唤醒中断状态,为 1 时表示发生了异步唤醒中断。为 0 时没有发生异步中断。
CALF(bit1):校准失败标志位,为 0 的时候表示校准正常完成,为 1 的时候表示校准失败。
ADACT(bit0):转换活动标志,为 0 的时候表示转换没有进行,为 1 的时候表示正在进行转换。

ADCx_HS 状态寄存器(COCO0表示转换完成)

COCO0(bit0):每次转换完成此位就会被置 1。

ADCx_HC0 控制寄存器

image
AIEN(bit7):转换完成中断控制位,为 1 的时候打开转换完成中断,为 0 的时候关闭。
ADCH(bit4:0):转换通道选择,可以设置为 00000~01111 分别对应通道 0~15。11001 为内部通道,用于 ADC 自测。

ADCx_R0 数据寄存器

image

流程代码

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;
}

标签:采样,控制器,转换,校准,使能位,ADC,寄存器,IMX6ULL
From: https://www.cnblogs.com/fuzidage/p/17798452.html

相关文章

  • IMX6ULL PWM定时器
    1PWM定时器介绍一共有8路PWM信号,每个PWM包含一个16位的计数器和一个4x16的数据FIFO。一路框图如下:①、此部分是一个选择器,用于选择PWM信号的时钟源,一共有三种时钟源:ipg_clk,pg_clk_highfreq和ipg_clk_32k。②、这是一个12位的分频器,可以对①中选择的时钟......
  • STM32F3系列 ADC采样单端采样模式(基于LL库)
    STM32F3系列ADC单端采样(基于LL库)芯片型号:STM32f303RBT6开发软件:MDK5&CubeMX&VSCode目录目录STM32F3系列ADC单端采样(基于LL库)目录引言1基础知识1.1ADC转换基本流程1.2时钟树1.3关键参数1.3.1位数1.3.2触发信号1.3.3采样时间1.3.4转换时间2CubeMx配置步骤......
  • springMVC controller控制器方法HttpServletRequest等参数的是谁传递进来的
    SpringMVC中两个重要的接口:请求方法参数的处理、响应返回值的处理,分别是HandlerMethodArgumentResolver和HandlerMethodReturnValueHandlerHandlerMethodArgumentResolver的实现类 ServletRequestMethodArgumentResolver 参数类型是实现或继承或是WebRequest、ServletRequest......
  • 基于32位Cortex™-M4的STM32F446RET7、STM32F429IGH6、STM32F423VHH6嵌入式微控制器(M
    描述STM32F432位Cortex™-M4微控制器(MCU)打开了进入数字信号控制器(DSC)市场的大门。这一系列器件与STM32F2系列引脚对引脚、软件相容,但是具有更好的性能、DSP性能、更多的SRAM,并改进了外设,如全双工I²S、低于1μA的RTC、2.4MSPS的ADC。意法半导体STM32F4MCU内含......
  • 基于高性能Cortex®-M7内核STM32F765VGT7、STM32F745IET6嵌入式微控制器
    STM32F732位MCU+FPU基于高性能的ARM®Cortex-M732位RISC内核®,工作频率高达216MHz。Cortex®-M7内核具有单浮点单元(SFPU)精度,支持所有ARM®单精度数据处理指令与数据类型。同时执行全套DSP指令和存储保护单元(MPU),增强应用安全性。1、STM32F765VGT7ICMCU32BIT1MB......
  • PLC、运动控制卡、运动控制器区别和联系
    前言最近有不少做PLC开发的小伙伴,在一些咨询运动控制卡、运动控制器相关的问题,很多人不清楚它们之间有什么区别和联系,今天跟大家就PLC、运动控制卡、运动控制器区别及选型做个分享。背景随着工业技术的发展,工业机器人应用越来越广泛,PLC也不再是简单的可编程逻辑控制器,......
  • 20版本Camplus控制器与其它版本的差异
    目录主界面隧道模式链路模板零配置开局无线认证LAN-WAN互联创建VN布局接口路由站点上网主界面如下所示:主界面整体为深蓝偏紫的颜色隧道模式如下所示,打开“EVPN”之后,在主界面上就会显示出“多分支互联”,SD-WAN的相关配置在按钮下进行配置。链路模板链路模板会提供两种接口服务,如下......
  • 如何在 macOS Sonoma 及更高版本上修复 Broadcom WiFi
    如何在macOSSonoma及更高版本本指南介绍了使用Clover和OpenCore在macOSSonoma及更高版本上修复BroadcomWiFi。通过遵循本指南,您将能够使用Clover或OpenCoreBootloader在macOSSonoma及更高版本上启用基于Broadcom的WiFi。本指南仅适用于OpenCore用户,可能......
  • JMeter-如果(if)控制器
    目录 前言 需求 一:添加商品信息接口 二、打开函数助手,选择__jexl3函数 三、添加逻辑控制器-如果(if)控制器 四、在如果(if)控制器下添加登录http请求 五、添加监听器-察看结果树 前言在实际工作中,当使用JMeter做性能脚本或者接口脚本时,当遇到需要对不同的条......
  • 安信可小安派【Analog to digital】 ADC 基于AI-M6x
    今天来分享一下我的ADC学习心得,首先说明当前的教程适用于所有的搭载AI-m61或者m62芯片的小安派。需要的库文件如库文件说明bflb_adc.hADC功能log.h用来打印日志bflb_gpio.h初始化GPIObflb_mtimer.h延时board.h初始化系统重要的方法如下:/***......