Adc模块用于检测引脚的电压,关于Adc模块的基本概念和Api可参考【MCAL】ADC模块详解-优快云博客。
基本的使用方式为软件触发+中断,即在周期任务中使用软件触发Api开启一组Adc的转换,转换完成后在中断中将转换结果写入到设定的缓冲区中。Adc模块的基本步骤为:
- 配置PCLK。
- 配置Port。
- 配置AdcHwUnit。
- 配置AdcChannel。
- 配置AdcGroup。
1. PCLK配置
Mcu模块配置相应PCLK时钟即可,不需要配置referencePoint,ADCx对应SARx。

2. Port配置
Adc功能使用时不用额外配置Port模块,默认即模拟输入。如果配置则如下:
AMUXA,PORT_PIN_LEVEL_LOW,PORT_PIN_OUT_MODE_HIGHZ。
具体哪个引脚可以复用为Adc通道见本文末尾处。
3. AdcHwUnit配置

在AdcConfigSet中新建3个AdcHwUnit,AdcHwUnitID分别选择ADC_SAR_0_0、ADC_SAR_0_1和ADC_SAR_0_2,表示硬件外设ADC1、ADC2和ADC3。
4. AdcChannel配置
在AdcHwUnit中新建AdcChannel。

-
AdcChannelId:表示该Adc通道的物理通道ID。
(ADC0的通道ID为0-31,ADC1的通道ID为64-95,ADC2的通道ID为128-159)
-
AdcChannelSampTime:采样时间,即该通道采用占用的时钟周期数。
(需要配置的大一些,否则会导致数据不准)
-
AdcChannelResultSigned :指定结果为有符号数或无符号数(一般不勾选)。
5. AdcGroup配置
在AdcHwUnit中新建AdcGroup。

在AdcGroupDefinition中引用配置的通道。引用的顺序(Index)即为通道转换值在组缓冲区中的位置索引。

AdcGroupAccessMode:使用单独访问模式/流访问模式。
- ADC_ACCESS_MODE_SINGLE:每个通道只缓存一个采样数据。
- ADC_ACCESS_MODE_STREAMING:每个通道可以缓存多个采样数据。

AdcGroupConversionMode:使用单次转换模式/连续转换模式。
- ADC_CONV_MODE_ONESHOT:每个通道只执行一次转换。Group配置为软件触发的情况下,已启动的一 次性转换可以通过软件API调用停止。Group配置为硬件触发的情况下,可 以通过禁用触发事件(如果硬件支持)来停止已启动的一次性转换。
- ADC_CONV_MODE_CONTINUOUS:对一个ADC信道组中的每个ADC通道进行重复转换。连续转换模式仅 适用于配置为软件触发的Group。已启动的“连续转换”可以通过软 件API调用停止。

- AdcGroupId:ADC组索引。(作为Adc标准接口的符号名称参数)
- AdcGroupPriority:ADC组优先级。
- AdcGroupReplacement :被别的ADC组打断后使用使用中止/重新启动机制还是暂停/恢复机制。
- AdcGroupTriggSrc:使用软件触发/硬件触发。

- AdcNotification:转换完成回调函数是否开启,开启则需配置名称。

- AdcFirstLogicalChannel :ADC组中第一个AdcChannel分配的逻辑通道ID。该逻辑通道可用于硬件触发。
(每个AdcHwUnit具有32条物理通道,也具有32条逻辑通道,逻辑通道主要用于Adc硬件触发。例如ADC1中配置了一个ADC组,组中有5条AdcChannel,为这个组分配的AdcFirstLogicalChannel为10,即组中第一个AdcChannel分配的逻辑通道ID为10,那么组中最后一个AdcChannel分配的逻辑通道ID为14。为ADC1中别的组分配逻辑ID就不能在10到14之间)

- AdcInterruptMode:是否使能中断模式。
- AdcUseDma:是否使用Dma。
6. 使用示例
6.1 软件触发+中断
初始化
Adc_Init(&AdcConf_AdcConfigSet_AdcConfigSet_0);
设置结果缓冲区
Adc_SetupResultBuffer(AdcConf_AdcGroup_Adc0_200HZ,CDDAdc_ConfigValue[0u].u32BufOfAdcHw);
使用软件触发接口开启转换
Adc_StartGroupConversion(AdcConf_AdcGroup_Adc0_200HZ);
开启组中最后一条通道对应的Adc中断
Cy_SysInt_SetSystemIrqVector((cy_en_intr_t)pass_0_interrupts_sar_13_IRQn,Adc_IsrConversionDone_136_Cat1);
Cy_SysInt_InitIRQ( &(cy_stc_sysint_irq_t){ .sysIntSrc=(cy_en_intr_t)pass_0_interrupts_sar_13_IRQn, .intIdx = CPUIntIdx4_IRQn, .isEnabled = true});
NVIC_EnableIRQ(CPUIntIdx3_IRQn);
在5msTask中周期调用
adcGroupSts = Adc_GetGroupStatus(AdcConf_AdcGroup_Adc0_200HZ);//获取Adc组状态
if( ADC_BUSY != adcGroupSts )
{
Adc_StartGroupConversion(AdcConf_AdcGroup_Adc0_200HZ);//不为忙碌则开启下一次转换
}
在设置的结果缓冲区中观察Adc转换结果。
6.2 定时器硬件触发
Tcpwm触发adc是一对一的专用触发,也就是说每个ADC逻辑通道都有唯一的TCPWM定时器通道与之对应。
触发关系如下:


例如要触发的组属于Adc0,触发频率需要为200Hz,该组AdcFirstLogicalChannel 为2,首先配置AdcGroupTriggSrc为硬件触发,AdcGroupHwTriggSrc 为TCPWM触发。

确定好要硬件触发的组的第一条逻辑通道后,需要根据上面的表格在Port中配置one-to-one触发源。根据表格,SAR0(Adc0)的ch#2使用的INPUT触发源是PASS0_CH_TR_IN[2],使用的定时器通道是PWM_1_M_6,也就是TCPWM1_262。
在Port模块的PortTriggerConfigSet_0中新建PortTr1To1GroupContainer,触发组名字选择PWM_TO_PASS,组ID为自动生成。

在PWM_TO_PASS的一对一触发源组中配置PASS0_CH_TR_IN[2]。

参照(四)Pwm模块配置配置TCPWM1_262的定时器。开启GptHwTriggerOutputLine并选为BOTH。

初始化
Adc_Init(&AdcConf_AdcConfigSet_AdcConfigSet_0);
设置结果缓冲区
Adc_SetupResultBuffer(AdcConf_AdcGroup_Adc0_500HZ,CDDAdc_ConfigValue[2u].u32BufOfAdcHw);
使能硬件触发
Adc_EnableGroupNotification(AdcConf_AdcGroup_Adc0_500HZ);
使能定时器
Gpt_StartTimer(GptConf_GptChannelConfiguration_Timer_16bit_500Hz_Adc0_Trigger, 20-1);//开启500hz定时器Adc0触发
开启组中最后一条通道对应的Adc中断
Cy_SysInt_SetSystemIrqVector((cy_en_intr_t)pass_0_interrupts_sar_34_IRQn,Adc_IsrConversionDone_157_Cat1);
Cy_SysInt_InitIRQ( &(cy_stc_sysint_irq_t){ .sysIntSrc=(cy_en_intr_t)pass_0_interrupts_sar_34_IRQn, .intIdx = CPUIntIdx4_IRQn, .isEnabled = true});
NVIC_EnableIRQ(CPUIntIdx3_IRQn);
(如果使用PWM触发则步骤一致)

6.3 软件触发+DMA
使用DMA需要打开AdcUseDma,如需开启转换完成回调函数则同时勾选AdcInterruptMode

与TCPWM硬件触发类似,需要配置one-to-one触发源

例如当前需要使用DMA的ADC组的最后一条逻辑通道为13,那么根据上表,使用的触发源为PDMA0_TR_IN[60](使用的DMA通道为DW.60),需在Port中配置


需要在Mcu中打开m7-0核的DMA使能

需要注意的是,使用DMA后通道的中断号会改变,由Adc_IsrConversionDone_XXX_Cat2变为Adc_DmaDone_XXX_Cat2,在EB配置生成的Adc_Irq.h中可以找到,不要忘记开启中断
7. Port口与ADC物理通道对应
该表格整理自CYT4BF数据手册,仅适用于CYT4B系列。
| 引脚 | ADC通道 |
|---|---|
| P6.0 | ADC[0]_0 |
| P6.1 | ADC[0]_1 |
| P6.4 | ADC[0]_4 |
| P6.5 | ADC[0]_5 |
| P6.6 | ADC[0]_6 |
| P6.7 | ADC[0]_7 |
| P7.0 | ADC[0]_16 |
| P7.1 | ADC[0]_17 |
| P7.2 | ADC[0]_18 |
| P7.3 | ADC[0]_19 |
| P7.4 | ADC[0]_20 |
| P7.5 | ADC[0]_21 |
| P7.6 | ADC[0]_22 |
| P7.7 | ADC[0]_23 |
| P8.1 | ADC[0]_24 |
| P8.2 | ADC[0]_25 |
| P8.3 | ADC[0]_26 |
| P8.4 | ADC[0]_27 |
| P9.0 | ADC[0]_28 |
| P9.1 | ADC[0]_29 |
| P9.2 | ADC[0]_30 |
| P9.3 | ADC[0]_31 |
| P10.4 | ADC[1]_0 |
| P10.5 | ADC[1]_1 |
| P10.6 | ADC[1]_2 |
| P10.7 | ADC[1]_3 |
| P11.0 | ADC[0]_M |
| P11.1 | ADC[1]_M |
| P11.2 | ADC[2]_M |
| P12.0 | ADC[1]_4 |
| P12.2 | ADC[1]_6 |
| P12.3 | ADC[1]_7 |
| P12.4 | ADC[1]_8 |
| P12.5 | ADC[1]_9 |
| P12.6 | ADC[1]_10 |
| P12.7 | ADC[1]_11 |
| P13.0 | ADC[1]_12 |
| P13.1 | ADC[1]_13 |
| P13.2 | ADC[1]_14 |
| P13.3 | ADC[1]_15 |
| P13.4 | ADC[1]_16 |
| P13.5 | ADC[1]_17 |
| P13.6 | ADC[1]_18 |
| P13.7 | ADC[1]_19 |
| P14.0 | ADC[1]_20 |
| P14.1 | ADC[1]_21 |
| P14.2 | ADC[1]_22 |
| P14.3 | ADC[1]_23 |
| P14.4 | ADC[1]_24 |
| P14.5 | ADC[1]_25 |
| P14.6 | ADC[1]_26 |
| P14.7 | ADC[1]_27 |
| P15.0 | ADC[1]_28 |
| P15.1 | ADC[1]_29 |
| P15.2 | ADC[1]_30 |
| P15.3 | ADC[1]_31 |
| P16.0 | ADC[2]_0 |
| P16.1 | ADC[2]_1 |
| P16.2 | ADC[2]_2 |
| P16.3 | ADC[2]_3 |
| P16.4 | ADC[2]_4 |
| P16.5 | ADC[2]_5 |
| P16.6 | ADC[2]_6 |
| P16.7 | ADC[2]_7 |
| P17.0 | ADC[2]_8 |
| P17.1 | ADC[2]_9 |
| P17.2 | ADC[2]_10 |
| P17.3 | ADC[2]_11 |
| P17.4 | ADC[2]_12 |
| P17.5 | ADC[2]_13 |
| P17.6 | ADC[2]_14 |
| P17.7 | ADC[2]_15 |
| P18.0 | ADC[2]_16 |
| P18.1 | ADC[2]_17 |
| P18.2 | ADC[2]_18 |
| P18.3 | ADC[2]_19 |
| P18.4 | ADC[2]_20 |
| P18.5 | ADC[2]_21 |
| P18.6 | ADC[2]_22 |
| P18.7 | ADC[2]_23 |
| P19.0 | ADC[2]_24 |
| P19.1 | ADC[2]_25 |
| P19.2 | ADC[2]_26 |
| P19.3 | ADC[2]_27 |
| P19.4 | ADC[2]_28 |
| P20.0 | ADC[2]_29 |
| P20.1 | ADC[2]_30 |
| P20.2 | ADC[2]_31 |
220

被折叠的 条评论
为什么被折叠?



