ADC模块
1 ADC介绍
功能:将模拟信号转换为数字信号
应用场景:同步转换和非同步转换
同步转换:TC234平台支持2路通道同时采样转换。在ADC模块内配置两个硬件单元ADC0、ADC1,不同的硬件模块的相同通道在同一时刻进行采样。
非同步转换:一组通道的每个Channel是依次采样。
同步采样需要使用到TOM的通道7输出的PWM波的周期中点触发ADC硬件采样来和另一个ADC的相同通道进行同步采样比较。
1.1 ADC kernel硬件转换单元结构
VADC模块的系统框图如下
外部连接主要有以下部分:
Analog reference voltage VAREF:ADC参考电压,也是ADC的量程
Analog reference ground VAGND:ADC参考基准地
Analog input Channels CHx:ADC模拟电压输入引脚
Ext.multiplexer control MUX [2:0]:多路复用控制器,用于控制ADC输入通道的外部多路复用器,允许选择不同的模拟信号源,一般很少使用。
内部主要有以下模块:
AD converter:AD转换器,主要负责逐次逼近转换的实现
Conversion control:转换控制器,主要负责转换模式的设置,例如采样时间,ADC分辨率等;
Interrupt Generation:中断发生单元,主要用于向IR模块产生中断信号;
Result Handling:结果处理器,可以对转换结果进行一系列处理,例如数据压缩,滤波,构建FIFO结构等;
Request control:请求控制器,主要负责处理转换请求,仲裁等;
1.2 电气属性
TC23x的ADC使用有CANSW表示的开关电容(每个输入引脚都存在寄生电容)。在采样阶段,CANSW通过输入多路复用器(由理想开关和串联电阻RAIN构成)连接到选定的模拟输入CHx。
CHx开关在采样阶段时关闭,并将电容场连接到输入电压VAINx。
内部阻抗REXT的模拟电压源(值VS)提供应转换的模拟输入。在采样阶段,相应的开关闭合,电容场闭合CAINSW开始充电。由于RC组合具有低通特性,要实际转换的电压VC并不立即跟随VS。模拟电压源REXT和所需的转换精度定义了所需的采样相位长度。
为了减少REXT的影响并过滤输入噪声,建议在ADC的模拟输入引脚处引入快速外部阻抗电容器CEXT。
1.3 生成转换请求
组的转换请求单元自主地处理转换请求的生成。三个请求源(2组特定源和后台源)可以生成模拟通道转换的请求。仲裁器解析并发请求并选择接下来要转换的通道。在触发事件发生时,请求源请求转换某个模拟输入通道或通道序列。
- 软件触发器
直接激活相应的请求源。
- 外部触发器
将请求源激活与外部事件同步,例如来自定时器产生PWM信号或来自端口引脚的触发脉冲。
每个请求源可以在单次或连续模式下运行:
在单次模式下,程序转换(序列)被触发后要求一次。必须再次触发后续的转换(序列)。
在连续模式下,程序转换(序列)在触发一次后自动重复请求。
有两种类型的请求源可用:
队列扫描源可以为任意序列的输入通道发出转换请求。这个序列的通道号可以自由编程。这支持通道扫描源无法覆盖的特定于应用程序的转换序列。此外,还支持序列中同一通道的多个转换。排队源永久地或按规则的时间基础转换一系列输入通道。
通道扫描源可以为输入通道的连贯序列发出转换请求。这个序列从最高启用的通道号开始,并继续向较低的通道号前进。所有可用通道可为扫描序列启用。每个通道在每个序列中转换一次。
扫描源永久地或按规则的时间基础转换一系列输入通道。例如,如果以低优先级编程,则可以在后台任务中扫描一些输入通道以更新非时间关键的信息。
队列扫描(Queued Scan)
队列扫描是一种将多个转换请求组织成队列的机制。队列扫描是一种针对单个ADC转换器的扫描模式。在这种模式下,转换请求被组织成一个队列,转换器按照队列中的顺序依次处理这些请求。这种方式适用于需要按特定顺序进行转换的场景,可以确保转换请求的执行顺序与队列中的顺序一致。在这种模式下,每个转换请求可以指定一个优先级,转换器会根据这些优先级来决定处理请求的顺序。这种模式适用于需要根据任务紧急性来动态调整转换顺序的场景。
通道扫描(Channel Scan)
通道扫描通常指的是按照一定的顺序自动遍历并转换一系列预定义的通道。在通道扫描模式下,转换器会自动按顺序处理每个通道的转换请求,无需手动干预。这种模式适用于需要连续监测多个传感器信号的场景,可以确保所有通道都能被周期性地转换。
1.4 模拟输入通道配置
对于每个模拟输入通道,可以配置一些参数来控制该通道的转换。通道控制寄存器定义以下参数:
1、通道参数:该通道的采样时间和结果的数据宽度通过输入类来定义。每个通道可以选择自己组的两个类中的一个或两个全局类中的一个。
2、参考选择:可以为大多数通道选择替代参考电压
3、结果目标:转换结果值存储在组特定的结果寄存器或全局结果寄存器中。
4、结果位置:结果值可以按左对齐或按右对齐存储。确切的位置还取决于配置的结果宽度和数据积累模式。
5、与标准转换(限制检查)比较:每当新结果值可用时,可以生成通道事件。通道事件生成可以限制在用户可配置频带内部或之外的值。
6、断线检测:此安全功能可以检测到模拟信号源(传感器)缺少连接。
7、转换的同步:同步转换在多个转换器上同时执行。
1.5 转换处理结果
A/D转换器可以对转换结果数据进行一定程度的预处理,然后再存储起来供CPU或DMA通道检索。
转换结果处理包括以下功能:
将转换结果存储到用户可配置的寄存器
根据结果宽度进行数据对齐
进行等待读取模式,以避免数据丢失结果事件
数据压缩或反混叠滤波
2 ADC硬件资源分布
3 EB工程搭建
3.1 配置Adc(非同步转换)
ADC软件转换:
使用ADC1的通道4(AN16)采集Sensor电压值
原理图:
(1)选择Adc->General选项卡
勾选AdcDeInitApi
勾选AdcEnableStartStopGroupAp,使能软件触发ADC采样
AdcPriorityImplementation,决定ADC硬件各个请求源的优先级选择,这里设置为空
(2)选择选择Adc->AdcConfigSet选项卡,双击打开配置文件AdcCongfigSet0。
①配置AdcCongfigSet0->General
AdcAnalogClockDivider,ADC模拟时钟分频系数。配置为4,表示设置为5分频AdcDigitalArbiterClockDivider,ADC仲裁周期分频系数。配置为3,表示设置为4分频AdcLowPowerSupplyVoltage,ADC参考电压AdcRefPrechargeControl,ADC参考电压预充电控制AdcSleepMode,ADC休眠模式AdcSystemClock,时钟源选择
②配置AdcCongfigSet0->AdcglobInputClass
该选项卡主要用于配置ADC采样的参数
AdcGlobChSampleTime,全局通道采样时间AdcGlobChResolution,全局通道分辨率
③配置AdcCongfigSet0->AdcHwUnit
<1>AdcHwUnit->General
AdcArbitrationRoundLength,仲裁长度AdcHwUnitId,对应的硬件单元AdcPostCal,位置校准AdcRequestSource x Prio,各个请求源的优先级,由于其前面配置AdcPriorityImplementation为空,所以这里不可选AdcSyncConvMode,同步模式
<2>AdcHwUnit->AdcChannel,定义ADC硬件单元对应的通道
根据自己的需求添加通道,这里添加一个通道AN16,看ADC硬件资源分布图可以看到对应的物理通道号为20。
双击打开通道0的配置文件,AdcChannel0
配置General选项
AdcAnChannelNum,ADC硬件通道AdcChannelId,软件层使用的逻辑 IDAdcChannelRefVoltsrcHigh,通道的参考电压AdcInputClassSelection,输入类型的选择
<3>AdcHwUnit->AdcGroup
配置General选项
AdcGroupAccessMode,ADC组访问模式,配置单次读取ADC_ACCESS_MODE_SINGLE,单次访问,保存一组数据ADC_ACCESS_MODE_STREAMING,连续访问,保存多组采样数据,通过设置AdcStreamingNumSamples来觉得保留最新的几次数据AdcGroupConversionMode,ADC组转换模式,配置单次转换ADC_CONV_MODE_ONESHOT,单次转换,触发一次转换一次ADC_CONV_MODE_CONTINUOUS,触发一次,连续转换AdcGroupRequestSource,ADC组请求源,需要配置对应的中断REQSRC0_8STG_QUE,对应Irq中的SR0REQSRC1_NCH_SCAN,对应Irq中的SR1
……
AdcGroupTriggSrc,ADC组触发源,选择软件触发
配置AdcGroupDefinition
将通道添加到组中
<4>配置AdcHwUnit->AdcKernelInputClass
配置两个组内的Class
注意:记得开启对应的中断和配置对应的Port引脚为模拟输入
3.2 配置Adc(同步转换)
使用ADC1_CH11和ADC0_CH11硬件同步采样,分别采集预驱A4911的A相电流和B相电流的AD值。
(1)Adc->General选项卡
相比于非同步配置,此处需要额外使能3个函数
AdcGrpNotifCapabilityAdcMasterSlaveSyncAdcHwTriggerApi
(2)Adc->AdcConfigSe选项卡
①General同上
②AdcGlobInputClass同上
③AdcHwUnit
添加两个ADC硬件单元
配置第一个ADC硬件
<1>AdcHwUnit_0->General
将AdcSyncConvMode配置为ADC_SLAVE
<2>AdcHwUnit_0->AdcChannel
添加一个通道G0_CH11_AN11
<3>AdcHwUnit_0->AdcGroup
添加一个组包含该通道
1)Adc0HwSyncGrp1> General
默认配置
2)Adc0HwSyncGrp1-> AdcGroupDefinition
<4>AdcHwUnit_0->AdcKernelInputClass
配置第二个ADC硬件
<1>AdcHwUnit_1->General
<2>AdcHwUnit_1->AdcChannel
添加一个通道G1_CH11_AN23
1)进入G1_CH11_AN23选项卡,使能AdcSyncChannel。(在通道中只有AdcSyncConvMode选择了ADC_MASTER才有使能AdcSyncChannel的选项。)
<3>AdcHwUnit_1->AdcGroup
同样添加一个组包含该通道
1)General
当访问模式是 SINGLE(单次访问);
且触发源是软件触发(SW);
且转换模式是 ONESHOT(单次转换);
那么必须配置为 LINEAR 模式。
当访问模式仍是 SINGLE;
但触发源是硬件触发(HW);
或者是连续转换模式(CONTINUOUS);
那么必须配置为 CIRCULAR(环形缓冲)模式
2)AdcHwTrigSignal
3)AdcGroupDefinition
<4>AdcHwUnit_1>AdcKernelInputClass
3.3 配置Mcu->Gtm->Cmu
参考4.2.1
3.4 配置Mcu->Gtm->Tom
(1)配置完Cmu,然后进入GtmConnections
配置ADC1通道的GTM触发通道为Tom1Ch7
由于前面的Master组中
AdcHwGatePin配置为ADC1_GTSEL_RS0_RS1_RS3_TIM_TRIG1
所以这里选择GtmTriggerForAdc_1,GtmTrigger1Select下面的配置项
“ADC1”对应GtmTriggerForAdc_1
“TIM_TRIG1”对应GtmTrigger1Select
(2)配置Tom1的TomChannel_0
(3)配置Tom1的TomChannel_7
3.5 配置Port
前面使用到ADC0_CH11,ADC1_CH4,ADC1_CH11
查看ADC通道的映射表格
分别对应P40.11,P41.4,P41.11
需要将对应的引脚配置为模拟通道输入
3.6 配置Irq
Adc1SwGrp0使用REQSRC1_NCH_SCAN,则需要开启ADC1的SR1
Adc1HwSyncGrp1使用REQSRC0_8STG_QUE,则需要开启ADC1的SR0
如果ADC0通道也使用到了中断触发,需要开启对应的SRx
4 Tasking工程搭建
4.1 导入库文件和EB生产的配置文件
4.2 添加导入文件的路径在Include Paths项目下
"\${workspace_loc:/\${ProjName}/Aurix_MC-ISAR/adc_infineon_tricore}" "\${workspace_loc:/\${ProjName}/Aurix_MC-ISAR/adc_infineon_tricore/ssc}" "\${workspace_loc:/\${ProjName}/Aurix_MC-ISAR/adc_infineon_tricore/ssc/inc}" "\${workspace_loc:/\${ProjName}/Aurix_MC-ISAR/adc_infineon_tricore/ssc/src}"5 API接口
| API接口 | 解释 |
|---|---|
| Adc_Init | Adc初始化接口 |
| Std_ReturnType Adc_SetupResultBuffer | 设置采样结果 |
| Adc_StartGroupConversion | 软件触发Group转换 |
| Adc_EnableHardwareTrigger | 硬件触发Group转换 |
6 Demo示例
6.1 非同步转换
#defineNUMBER_OF_ADC_CH(1)Adc_ValueGroupType AdcResultBuff[NUMBER_OF_ADC_CH];intmain(void){Std_ReturnType RetVal;Mcu_Init(&Mcu_ConfigRoot[0]);// 初始化McuRetVal=Mcu_InitClock(0);if(RetVal==E_OK){while((Mcu_GetPllStatus())==0){}Mcu_DistributePllClock();}Port_Init(&Port_ConfigRoot[0]);// 初始化PortDio_Init(&Dio_ConfigRoot[0]);// 初始化DioAdc_Init(&Adc_ConfigRoot[0]);// ADC初始化// 设置Group0数据保存位置Adc_SetupResultBuffer(AdcConf_AdcGroup_AdcGroup_0,AdcResultBuff);/* Irq */IrqAdc_Init();Mcal_EnableAllInterrupts();while(1){// 软件触发Group转换Adc_StartGroupConversion(AdcConf_AdcGroup_AdcGroup_0);Sensor5V=((double)AdcResultBuff[0]/4095.0)*5.0/(10.0/20.0);}}6.2 同步转换
在初始化之后,使用硬件触发Group转换,然后开启Tom
Adc_ValueGroupType AdcResultBuff[3];intmain(void){Std_ReturnType RetVal;Mcu_Init(&Mcu_ConfigRoot[0]);// 初始化McuRetVal=Mcu_InitClock(0);if(RetVal==E_OK){while((Mcu_GetPllStatus())==0){}Mcu_DistributePllClock();}Port_Init(&Port_ConfigRoot[0]);// 初始化PortDio_Init(&Dio_ConfigRoot[0]);// 初始化DioAdc_Init(&Adc_ConfigRoot[0]);// ADC初始化IrqAdc_Init();Mcal_EnableAllInterrupts();// 设置Group0数据保存位置Adc_SetupResultBuffer(AdcConf_AdcGroup_Adc1SwGrp0, &AdcResultBuff[0]);Adc_SetupResultBuffer(AdcConf_AdcGroup_Adc1HwSyncGrp1,&AdcResultBuff[1]);Adc_EnableHardwareTrigger(AdcConf_AdcGroup_Adc1HwSyncGrp1);Gtm_SetTomShadowValSr1(1,7,2500);while(1){Adc_StartGroupConversion(AdcConf_AdcGroup_Adc1SwGrp0);Sensor5V=((double)AdcResultBuff[ADC1_CH4_AN16]/4095.0)*5.0/(10.0/20.0);IA_FB=AdcResultBuff[2];IB_FB=AdcResultBuff[1];}}7 测试
MCU:TC234
调试器:Lauterbach
调试软件:TRACE32 ICD TriCore USB
7.1 非同步转换
劳德巴赫中监测变量值如下:
7.2 同步转换
劳德巴赫中监测变量值如下: