MPC5744P-ADC模块(模数转换模块)

1.结构

5744P含有4个AD模块,每个模块包含16个通道。AD模块为12位逐次积分结构,采样和转换时间小于1us。ADC运行模式有为常规模式和电机控制模式,本文在常规模式下。AD模块可在CPU和CTU控制下工作,本文在CPU控制下工作。AD模块可分为ADCD(数字部分)和ADCA(模拟部分)两个部分,内部结构如下:

1)ADCD:ADC数字接口,含有配置、控制和状态寄存器。被转换的值存储在寄存器内,由主机访问或DMA传输。

2)ADCA:ADC模拟硬件宏单元,接入外部模拟输入通道,每个通道通过指定周期的采样后与数字部分通过DAC产生的模拟电压比较,比较结果送入ADCD部分产生转换值。

1.时钟

AD模块含有两部分时钟,分别是:1)ipg_clk:ADCD模块的时钟。2)AD_clk:该时钟用于ADCD模块中的运行时钟和逐次积分控制器。如果寄存器中MCR[ADCLKSEL]=1,AD_clk等于ipg_clk,如果MCR[ADCLKSEL]=0,AD_clk等于ipg_clk的一半。

ADC模块除配置外设桥时钟外,还需单独配置ADC_CLK时钟,具体配置见时钟配置ADC_CLK模块。

2.ADC 通道

ADCD能控制96个ADC通道,分别为将高精度通道0~31,扩展内部通道32~63和外部通道64~95。5744每个ADC模块使用的是高精度通道0~15.

3.转换模式

5744 ADC模块有正常、注入和CTU/BCTU触发模式,本文只包含了正常转换模式,注入模式与正常转换模式类似。

1)正常转换模式

正常转换模式的步骤为:

  • 配置寄存器NCMR0~2选择要转换的通道,每一位对应一个通道,可单独配置;
  • 软件设置MCR[NSTART]为1开始转换或者在配置触发转换使能的情况下外部触发信号被检测到以开始转换

正常转换模式下有单次转换和扫描转换两种方式,MCR[MODE]=1为扫描模式,MCR[MODE]=0为单次转换模式。单次转换模式是指被选择的通道只进行一次转换,继续转换需要重新启动。循环模式是指被选择的通道完成一次转换后自动开始新一轮转换直到MCR[NSTART]被置0。无论是单次转换还是扫描转换模式,每个通道转换完成后会自动置位相应的通道转换完成标志位并且在所有指定通道转换完成后会置位通道链转换完成标志位。

2)注入转换模式

注入转换模式的步骤为:

  • 配置寄存器JCMR0~2选择要注入转换的通道,像正常转换一样每一位对应一个通道,可单独配置;
  • 软件设置MCR[JSTART]为1开始转换或者在配置触发转换使能的情况下外部触发信号被检测到以开始转换

注入转换只能是单次转换模式,它只能打断正常转换而无法打断CTU转换。当有注入转换时,正常模式被挂起,注入转换开始进行,当注入转换完成后,正常模式从被打断的通道开始继续进行。

同正常模式一样,每个通道转换完成后会自动置位相应的通道转换完成标志位并且在所有指定通道转换完成后会置位通道链转换完成标志位。

2.配置步骤

5744AD模块的基本配置步骤如下(正常转换模式):

1.ADC_CLK时钟配置(见第一篇时钟配置ADC_CLK模块);

2.外设运行模式选择,ADC1对应MC_ME.PCTL126寄存器;

3.引脚多路复用功能选择,SIUL2模块配置;

4.进入下电模式,MCR[PWDN]=1,由于很多配置寄存器均需在下电模式配置,故需要先进入下电模式;

5.时钟选择、转换模式设置,配置MCR寄存器;

6.选择要转换的通道,配置NCMR0~2寄存器;

7.退出下电模式,MCR[PWDN]=1;

8.开始运行,MCR[NSTART]=1;

3.寄存器介绍

本节以正常转换模式为例,介绍用到的寄存器和寄存器内各设置和标志位。

1.MCR寄存器 模块控制寄存器

  • OWREN 覆盖使能位
                  0    不允许旧的有限制被新转换的值覆盖
                  1     新转换的值总是符号旧值
  • WLSIDE 写左右对其
                   0    转换结构右对齐,resolution-1到0位有效
                   1    转换结构左对齐,15到15-resolution+1位有效
  • MODE     单次转换/扫描转换模式选择
                    0    选择单次转换模式
                    1    选择扫描转换模式
  • NSTART   开始转换位
                    0    停止转换
                    1    开着转换
  • ADCCLKSEL   时钟频率选择位
                            0    AD_clk等于ipg_clk的一半
                            1    AD_clk等于ipg_clk
  • PWDN     下电模式选择位
                     0    退出下电模式
                     1    进入下电模式

2.ADC_ISR   中断状态寄存器

  • EOC     通道转换完成标志位
                 0    通道转换未完成
                 1    通达转换完成
  • EOH     通道链转换完成标志位
                 0    通道链转换未完成
                 1    通道链转换完成

3.ADC_CEOCFR0寄存器 通道状态寄存器,当对应通道转换完成,该寄存器内对应通道标志位置位,写1清零

 

4.ADC_NCMR0寄存器 正常转换模式通道选择寄存器,相应通道的标志位置1选择该通道进行模数转换。

5.ADC_CDRn寄存器 通道数据寄存器,含有是否有效标志位、覆盖标志位、转换模式标志位和数据段。

  •  VALID    是否有效标志位,数据被读取后自动清零
                  0    数据无效
                  1    数据有效
  • OVERW    是否覆盖标志位
                     0    数据未被覆盖
                     1    数据被覆盖
  • RESULT    转换模式
                     00    正常转换模式
                     01    注入转换模式
                     10    CTU转换模式
                     11    保留
  • CDATA     12位转换数据

4.示例代码

1)初始化部分,根据第二节所示步骤,代码实现如下:

/***********************************************
 * 函数名        ADC_ADC1_Init
 * 功能          对ADC模块1的指定通道进行初始化
 * 输入参数
 *               ADC_CHANNELx
 *               通道号 x可为0~15 如
 *               ADC_CHANNEL0 选择通道0
 * 返回值         无
 * 示例           ADC_ADC1_Init(ADC_CHANNEL6);//ADC模块1通道6进行初始化
 ***********************************************
 */
static void ADC_ADC1_Init(uint8_t ADC_CHANNELx)
{
	//外设运行模式选择
	MC_ME.PCTL126.R=0x00000000;       //选择ME_KP_PC0配置,ME_RUN_PC0配置

	//引脚多路复用功能选择
	if(ADC_CHANNELx==ADC_CHANNEL6)
	{
	    SIUL2.MSCR[76].B.SSS=0;           //选择GPI模式,ADC1_AN[6]
	    SIUL2.MSCR[76].B.APC=1;           //选择模拟PAD control
	}

	//ADC初始化寄存器配置
	ADC_1.MCR.B.PWDN=0;               //进入下电模式
	ADC_1.MCR.B.ADCLKSEL=1;           //选择等于总线时钟
	ADC_1.MCR.B.MODE=1;               //选择scan模式
	ADC_1.MCR.B.OWREN=1;              //允许重写数据寄存器
	ADC_1.NCMR0.R|=(1<<ADC_CHANNELx); //选择CH

	ADC_1.MCR.B.PWDN=0;               //退出下电模式
	ADC_1.MCR.B.NSTART=1;             //开始转换

2)数据读取部分

AD模块转换后的数据可通过中断模式读取,也可通过通道标志位轮询的方式读取。

中断模式需要配置通道中断寄存器ADC_CIMR0,该寄存器对应为置1则开启对应通道的转换完成中断,若为通道链转换模式也需要配置ADC_IMR[ECH]为1来使能通道链转换完成中断功能。然后设计对应的中断函数来读取AD转换后的数值并清除ADC_CEOCFR0和ADC_ISR中对应的标准位。

本文选择标志位轮询的方式读取转换数据,代码如下:

/****************************************************
 * 函数名         ADC_ADC1_GetResult
 * 功能           获取ADC模块1指定通道的数据
 * 输入参数
 *                ADC_CHANNELx
 *                通道号 x可为0~15 如
 *                ADC_CHANNEL0    选择通道0
 * 返回值         ADC模块1 通道x的AD转换数据
 * 示例           ADC_ADC1_GetResult(ADC_CHANNEL0);//获取ADC模块1通道0的AD转换数据
 ****************************************************
 */
uint16_t ADC_ADC1_GetResult(uint8_t ADC_CHANNELx)
{
	uint16_t adc_result=0;
	while(!ADC_1.CEOCFR0.B.EOCCH6);               //轮询标志位,等待转化完成
	adc_result=ADC_1.CDR[ADC_CHANNELx].B.CDATA;   //获取转换数据
	ADC_1.CEOCFR0.B.EOCCH6=1;                     //清除标志位
	return adc_result;
}

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值