简介

在S32K中,不同的芯片型号支持的ADC通道不同,S32K144UAVLL有两个ADC,每个ADC有12位、10位、8位和6位可选,每个ADC有16个外部通道。学习ADC的第一步是要掌握ADC的功能框图,对ADC的工作过程和编程过程有个整体的了解。

ADC功能框图

对ADC的配置主要涉及三种寄存器,控制状态寄存器、触发寄存器和数据寄存器。控制状态寄存器主要有SC2SC3CFG1CFG2;触发寄存器主要有SC1SC2;数据寄存器主要有Rn

电压输入范围

ADC的输入电压范围为:VREFL≤VIN≤VREFHV_{REFL}≤V_{IN}≤V_{REFH}VREFL​≤VIN​≤VREFH​,ADC的输入范围取决于4个参考电源VREFL、VREFH、VDDA、VSSAV_{REFL}、V_{REFH}、V_{DDA}、V_{SSA}VREFL​、VREFH​、VDDA​、VSSA​ 。

​ADC的电压输入范围取决于4个参考电源​,我们在设计原理图的时候一般把​VREFLV_{REFL}VREFL​ 和​VSSA​V_{SSA}​VSSA​ 接地,把​VREFHV_{REFH}VREFH​ 和​VDDA​V_{DDA}​VDDA​ 接3.3V,可以得到ADC的输入范围是0~3.3V。在设计原理图时,应该把ADC设置为可以配置成外用输入电压参考源,以备不时之需,如下图所示。

如上图所示,​有三个选项。

  1. 焊接上R103,拆掉R99,R109和D7,电压参考源为VDD_MCU,一般为3.3V
  2. 焊接上D7和R99,拆掉R103和R109,R99进行分压之后为3V
  3. 焊接上R109,拆掉R103,R99和D7。这里的​是外部输入电压引脚,可以配置为外部电压参考源

时钟配置

可以选择4个时钟源ALTCLKx之一来作为ADC模块的时钟源。ADC具有多个时钟源。 选择取决于配置PCC_ADCn[PCS]。 分频器的配置应使ADC转换时钟频率在ADC要求的有效范围内(请参见数据手册)。如下图所示为ADC的时钟分配图。

如图所示,ADC的时钟源输入通过PCC_ADCn[PCS]来选择SOSCDIV2_CLKSIRCDIV2_CLKFIRCDIV2_CLKSPLLDIV2_CLK四种,然后经过ADC_CFG1[ADIV]来时钟分频,最后产生ADC的输入时钟ADCKADCK由数据手册可得,最大50MHZ,最小2MHZ,典型值为40MHZ,如果超过最大频率,ADC的转换结果会变得不可靠。ADC时钟设置流程如下:

  1. 设置PCC_ADCn[PCS]:选择时钟源
  2. 设置ADC_CFG1[ADICLK]:选择时钟输入
  3. 设置ADC_CFG1[ADIV]:选择时钟分频

转换时间

数据手册显示,ADC的转换时间取决于:

  • ADC_CFG2[SAMPLTS]确定的采样时间
  • MCU的Bus总线时钟频率
  • ADC_CFG1[MODE]确定的转换模式
  • fADCKf_{ADCK}fADCK​即ADC的转换时钟频率

由数据手册可得,ADC的总转换时间=采样相位时间(SMPLTS设置的再+1)+保持相位(1个ADC周期)+比较相位时间(8位模式=20个ADC周期,10位模式=24个ADC周期,12位模式=28个ADC周期)+单个或第一个连续时间加法器(5个ADC周期+5个总线时钟周期)

例:设置BUS时钟为40MHZ,ADC时钟选择40MHZ,12位ADC,采样周期选择255个ADC周期,计算ADC的一次转换时间为:
Tconv=255+1+1+28+54×106+54×106=73.75μsT_{conv}=\frac{255+1+1+28+5}{4×10^6 }+\frac{5}{4×10^6}=73.75μsTconv​=4×106255+1+1+28+5​+4×1065​=73.75μs

触发设置


ADC触发设置主要包括寄存器SC2SC1。ADC支持软件触发和硬件触发两种,软件触发就是在ADC转换完毕之后产生中断;在硬件触发方面,ADC模块具有可选的异步硬件转换触发器ADHWT,主要通过PDB来触发。触发设置可见PDB触发ADC。设置ADC_SC2[ADTRG]来选择是硬件触发还是软件触发。触发方式的设置流程如下:

  1. 设置ADC_SC2[ADTRG]:选择触发方式
  2. 设置ADC_SC1n[ADCH]:选择ADC通道
  3. 如果上一步使用了具有硬件交错功能的通道,则需要设置SIM_CHIPCTL[ADC_INTERLEAVE_EN]
  4. 设置ADC_SC1n[AIEN]:开启中断触发(软件触发模式下)

获得ADC数据

最后转换成功后,ADC的转换结果会被存放在ADC_Rn寄存器,ADC_Rn寄存器对应的是ADC_SC1n寄存器,比如ADC_SC1A的数据会存放在ADC_RAADC_SC1B的数据会存放在ADC_RB,以此类推。

在不同的转换位数下,ADC_Rn寄存器的数据位数也不同,如下图所示。

注:ADC_Rn寄存器是只读的

电压转换

模拟电压经过ADC转换后,是一个相对精度的数字值,如果通过串口以16进制打印出来的话,可读性比较差,故需要把数字电压转换为模拟电压,也可以根据实际的模拟电压(用万用表测)对比,看看转换是否准确。

在设计原理图时,一般会把ADC的输入电压范围定在0~3.3V,若设置的ADC为12位,那么12位满量程对应的就是3.3V,12位满量程对应的数字值是:2122^{12}212 。数值0对应的就是0V。如果转换后的数值为X,X对应的模拟电压为Y,那么:
2123.3=XY→Y=3.3×X212\frac{2^{12}}{3.3}=\frac{X}{Y} → Y=\frac{3.3\times X}{2^{12}}3.3212​=YX​→Y=2123.3×X​

实例:ADC触发中断

功能概述

  • 平台:S32K144

现在使用S32K144的ADC0通道8,软件触发模式下,转换结束后触发中断。

编程顺序

  1. 初始化ADC0的时钟
  2. 初始化ADC0的位数
  3. 选择ADC0的通道,开启中断
    • 如果该通道有硬件交错功能,需要选择是哪个ADC通道
  4. 选择软件触发
  5. NVIC开启ADC中断
// ADC初始化函数
void ADC0_Init(void)
{PCC->PCCn[PCC_PORTA_INDEX] |= PCC_PCCn_CGC_MASK;   /* Enable clock for PORTA */SIM->CHIPCTL |= (1 << 2);   /* 具有硬件交错功能,选择PTB13 */PCC->PCCn[PCC_ADC0_INDEX] &= ~PCC_PCCn_CGC_MASK;  PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_PCS(6);     /* PCS=6: 选择内核时钟80MHZ */PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_CGC_MASK;  ADC0->CFG1 = ADC_CFG1_ADIV(2) |     /* ADIV=2:输入内核时钟两分频=40MHZ */ADC_CFG1_MODE(1) |     /* MODE=1: 12位ADC */ADC_CFG1_ADICLK(0);    /* ADICLK=0: 默认选择PCC分配的时钟 */ADC0->SC1[0] = ADC_SC1_AIEN_MASK |    /* AIEN=1: 开启中断触发 */ADC_SC1_ADCH(8);     /* ADCH=8: 序号0选择通道8 */ADC0->SC2 |= ADC_SC2_ADTRG(0);    /* ADTRG=0: 开启软件触发 */ADC0->SC3 = 0;       S32_NVIC->ICPR[1] = 1 << (39 % 32);  /* 注册ADC0中断 */S32_NVIC->ISER[1] = 1 << (39 % 32);  /* 使能ADC0中断 */S32_NVIC->IP[39] = 0xA0;             /* 优先级为10 */
}
/** \brief adcChan通道开启一次ADC转换** \param adcChan 需要进行ADC转换的通道**/
void convertAdcChan(uint16_t adcChan)
{   ADC0->SC1[0] &= ~ADC_SC1_ADCH_MASK;  /* Clear prior ADCH bits */ADC0->SC1[0] = ADC_SC1_ADCH(adcChan); /* Initiate Conversion*/
}/** \brief ADC转换判断函数** \return >0 转换已完成* \return =0 转换未完成**/
uint8_t adc_complete(void)
{return((ADC0->SC1[0] & ADC_SC1_COCO_MASK) >> ADC_SC1_COCO_SHIFT);
}/** \brief ADC值转换函数** \return 返回转换后的ADC电压值**/
uint32_t read_adc_chx(uint8_t ChanIndex)
{uint16_t adc_result = 0;adc_result = ADC0->R[ChanIndex]; /* For SW trigger mode, R[0] is used */return(uint32_t)((5000 * adc_result) / 0xFFF); /* Convert result to mv for 0-5V range */
}void ADC0_IRQHandler(void)
{adcRawValue1 = read_adc_chx(0);adcRawValue2 = read_adc_chx(1);adcConvDone = true;
}

S32K系列之ADC相关推荐

  1. S32K系列之PDB框图详解及PDB触发ADC

    可编程延迟模块PDB,PDB可提供从内部或外部触发或可编程间隔信号到ADC硬件触发输入的可控制延迟. PDB可以选择提供脉冲输出,用作CMP块中的采样窗口. S32K系列的PDB资源如下表: PDB功 ...

  2. NXP的S32K系列MCU怎么样?

    关注.星标公众号,直达精彩内容 来源:网络素材 整理作者:李肖遥 前言 最近因为工作需要,在学习恩智浦的S32K344,希望能通过博客的方式完成对学习过程的一个记录,不仅方便日后查找,而且在梳理过程中 ...

  3. S32K系列芯片--简介

    1.1        概述 S32K1xx系列产品在汽车行业中进一步扩展了Arm®Cortex®-M0+/M4F MCU的高度可扩展产品组合.它建立在KEA系列的遗产之上,同时引入更高的内存选项和更丰 ...

  4. STM32L0系列之ADC采集

    STM32L0开发系列--01 ADC采集 前言 使用芯片:STM32L051C8T6 软件平台:KEIL V5.STM32CubeL0 库函数:HAL 一.原理图 本文介绍在STM32上使用ADC1 ...

  5. 采样频率和带宽的关系_ADI公司AD7380系列SAR ADC的片内过采样

    原标题:ADI公司AD7380系列SAR ADC的片内过采样 本文引用地址: 简介 本应用笔记讨论逐次逼近寄存器(SAR)型模数转换器(ADC)中的片内过采样.常见过采样技术有两种:正常平均和滚动平均 ...

  6. S32K系列S32K144学习笔记——LPIT0

    一用S32K144苦似海,道友,能不用,千万不去用. 本例程基以下如图所示接口操作,MCU为S32K144,开发平台S32DSworkspace 功能描述:开启LPIT0定时器,LED以0.5s时间间 ...

  7. S32K系列S32K144学习笔记——ADC

    一用S32K144苦似海,道友,能不用,千万不去用. 本例程基以下如图所示接口操作,MCU为S32K144,开发平台S32DSworkspace 功能描述:读取端口电压 如有错误,麻烦帮忙指出,谢谢! ...

  8. STM32H7学习继续(STM32H7系列9) ADC

    以<<STM32H7 开发指南(HAL 库版)>>为导引学习 ADC性能参数 STM32H743xx 系列有 3 个 ADC,都可以独立工作, 其中 ADC1 和 ADC2 还 ...

  9. Aurix TC3xx系列MCU ADC模块简介(一)

    文章目录 1 前言 2 ADC模块简介(TC3xx) 1.1 ADC模块特点 1.2 转换器内部结构 1.3 转换时间 3 EDSADC模块简单介绍 >>返回总目录<< 1 前 ...

最新文章

  1. shell任务不受意外中断影响的常见方法
  2. Visual Studio 2019更新到16.2.2
  3. ubuntu下firefox中,直接在网页上安装程序的方法
  4. 好班微校云信聊天解读记录
  5. 我是如何使用git把本地代码上传到CODECHINA上的,值得借鉴
  6. 带通滤波器作用和用途_带通滤波器作用
  7. 分治法在排序算法中的应用(JAVA)--快速排序(Lomuto划分、Hoare划分、随机化快排)
  8. Okhttp实用封装
  9. Docker学习总结(56)——Docker-compose 基础知识温习
  10. linux下tar压缩使用
  11. 织梦程序添加音乐上传功能
  12. pt和px区别 pt是逻辑像素,px是物理像素
  13. SVN解决 Node remains in conflict
  14. cocos2dx 制作一个简单的三消游戏
  15. 一转眼,波士顿动力 Atlas 机器人又会过独木桥了!
  16. 右键计算机没有软件删减,右键菜单太长会导致电脑卡顿?轻松删除右键菜单无用项!...
  17. 2024年上海美博会-上海浦东美博会(上海CBE)
  18. 《所谓高情商,就是会说话》思维导图精华分享
  19. 【C语言管理系统】 医院住院病人信息管理系统
  20. C语言排列组合(函数

热门文章

  1. (个人笔记-无用勿喷)Windows软件包的安装与卸载
  2. (转)爱剪辑学习记录_快速剪辑视频
  3. adb bugreport :查看设备所有信息(获取错误报告)
  4. 厦门明发家乐福免费班车行车线路和时间表
  5. java 改变窗口大小_java 如何让程序窗口随屏幕大小改变
  6. 《物联网实战指南》读书笔记
  7. 公司邮箱登录,邮件多长时间能撤回,有时间限制吗?
  8. elementUI表格气泡乱串、闪烁、位置偏移问题解决(自制气泡,计算位置,箭头永远指向当前元素)
  9. ES查询中有should的组合查询应注意minimum_should_match
  10. Web开发基础——CSS