当前位置:   article > 正文

S32K144(14)ADC_s32k adc pdb dma

s32k adc pdb dma

1、简介

开发板S32K144+S32DS+JLINK,裸机版的程序编写

S32K14x包含两个12位ADC模块,ADC0和ADC1

  • 应用程序可能需要ADC的连续采样(4K采样/秒),这可能对CPU有相当大的负载。虽然使用可编程延迟块(PDB)来触发ADC可能会减少一些CPU负载,但当ADC以非常高的速率采样或PDB被绕过时,ADC支持DMA请求功能以获得更高的性能。ADC可以在转换完成时触发DMA(通过DMA请求)。TRGMUX会根据不同的应用需求,使用软件为用户提供更灵活的DMA触发方案,例如,可以在多个ADC转换完成后触发DMA,而不是每次ADC转换完成后触发
  • 双ADC模块支持交错(interleave)采样通道
  • ADC触发源:触发器通过PDB或TRGMUX连接,提供灵活的触发方案,PDB为ADC生成触发器和预触发器(ADC和PDB成对操作,每个PDB通道将有多达8个预触发器用于ADC通道控制,这提供了一个自动触发方案,因此无需CPU参与
  • CMP out、LPIT、RTC和LPTMR能够通过TRGMUX触发每个ADC。LPIT最多支持4个预触发器,这些预触发器只能在每个ADC的ADHWTS0-ADHWTS3上使用。对于其余的外设,需要软件配置来提供预触发器。请参见SIM_ADCOPT[ADCxSWPRETRG]配置软件预触发
  • ADC触发方案。ADC一般支持两种触发方式:默认的触发方案使用PDB触发ADC(建议)。另一个可选的触发方案是使用TRGMUX。请注意对于TRGMUX触发,最多只有4个预触发,SIM_ADCOPT[ADCxTRGSEL]字段用于控制ADC触发源/方案。当ADCxTRGSEL=0时,ADC预触发直接来自PDB。当ADCxTRGSEL=1时,ADC预触发来自TRGMUX,如在LPIT。

注意:在使用TRGMUX时,只有LPIT支持预触发器。对于其他外设,需要使用SIM_ADCOPT[ADCxSWPRETRG]配置软件预触发器

1.1、PDB触发方案是ADC的默认触发方案,

也是建议的触发方式。一个ADC和一个PDB作为一对:PDB0-ADC0, PDB1-ADC1。PDB0和PDB1的触发源可以分别通过TRGMUX_PDB0和TRGMUX_PDB1配置。

这里我们以PDB0-ADC0为例来指定触发方案。

  1. 设置SIM_ADCOPT [ADCxTRGSEL] = 0。
  2. 选择PDB0通道0作为ADC触发源。
  3. PDB0预触发器将直接连接到ADC0 ADHWTS端口来控制通道。
  4. ADC0 COCO信号被直接反馈回PDB0去激活PDB锁定状态。

下图说明了使用PDB触发ADC的典型案例:

1.2、LPIT触发ADC步骤:

LPIT最多支持4个通道,每个通道都有一个触发器和一个预触发器。

  1. 设置SIM_ADCOPT [ADCxTRGSEL] = 1。选择TRGMUX out作为ADC触发源。
  2. 配置TRGMUX以选择LPIT触发器作为ADC触发器和预触发器源。TRGMUX只支持每个ADC最多4个预触发器(pre-trigger0-pretrigger3;其他预触发器不能与TRGMUX一起使用)。
  3. ADC COCO在这种情况下是不需要的。软件必须适应每个ADC转换之间的间隔时间。
  4. 使用TRGMUX允许使用一个LPIT来同时触发两个adc。这是使用TRGMUX触发代替PDB触发的好处之一。

请注意对于除PDB和LPIT之外的触发器源,需要软件提供ADC预触发器。

1.3、被触发后的选择

可以选择触发启用和触发的任意组合;它们是相互独立的。但是在它被选中之后,就不能动态地更改它了。

定义了更改触发器和启用源(触发器和预触发器源)的步骤。改变触发源可以通过以下两种方法中的任何一种随时完成。

1.3.1、方法1

  1. 停止当前触发产生单元。
  2. 等待一个时间周期等于ADC工作时钟的2.5个周期和ADC主机接口时钟的1.5个周期,给锁存最后一个触发器的时间,如果有的话
  3. 轮询所有0的ADC_SC2[TRGSTLAT]的状态,它将在完成所有查询到那时为止的转换后变为0
  4. 更改所需源的选择,然后
  5. 启动新的触发单位

1.3.2、方法2需要立即切换

  1. 停止当前触发产生单元
  2. 通过设置ADC_CFG1[CLRLTRG]刷新触发器处理程序块的所有排队触发器,这将刷新除ADC正在处理的触发器(如果有的话)之外的所有排队触发器
  3. 等待一个时间周期等于ADC工作时钟的总2.5个周期
  4. 等待ADC_SC2[TRGSTLAT]的状态变为全0
  5. 更改所需源的选择,然后启动新的触发单位

请注意如果不遵循上述限制,则可能不会报告此流程错过的触发器

1.4、ADC模块的特点

  • 高达12位分辨率的线性逐次逼近算法
  • 单端12位、10位、8位输出模式
  • 输出为右对齐的无符号格式
  • 单次或连续转换模式
  • 可配置样品时间和转换速度/功率
  • 转换完成/硬件平均完成标志中断
  • 可选软件触发转换/硬件触发AD转换(触发源和通道有相应的PDB模块和TRGMUX配置)
  • 支持可编程自动比较(大于、小于、等于,范围内或超出范围)功能
  • 支持硬件2/4/8/16/32次采样平均输出功能;
  • 外部可选参考电压VREFH/VREFL
  • 自校准功能,保证ADC采样精度,在完成ADC模块初始化后开始ADC采样转换前,必须做自校准(调用S32K SDK ADC组件的相应API函数即可),才能获得TUE=±4LSB 的转换精度
  • ADC的采样保持时间必须设置的足够长,以满足ADC通道间切换时内部采样电容能够真实反映外部信号的最快变化

2、原理图

3、寄存器

3.1、SC1A - aSC1P: ADC Status and Control Register 1

SC1A用于软件和硬件触发模式的操作。

Field

Name

Description

0-5

ADCH

输入通道选择

6

AIEN

转换完成中断使能

7

COCO

转换完成标志

3.2、CFG1: ADC Configuration Register 1

配置寄存器1 (CFG1)选择操作方式、时钟源、时钟分频。

Field

Name

Description

0-1

ADICLK

输入时钟选择

2-3

MODE

选择ADC的分辨率

5-6

ADIV

输入时钟分频

8

CLRLTRG

清除所有锁触发器

3.3、CFG2: ADC Configuration Register 2

CFG2 (Configuration Register 2)在长采样模式下选择长采样时间

Field

Name

Description

0-7

SMPLTS

采样周期选择

3.4、RA - aRP: ADC Data Result Registers

数据结果寄存器(Rn)包含通道ADC转换的结果,下表描述了不同的数据结果寄存器模式的操作。

Field

Name

Description

0-11

D

数据结果

3.5、CV1 - CV2: Compare Value Registers

比较值寄存器(CV1和CV2)包含一个用于比较的比较值

Field

Name

Description

0-15

CV

比较值

3.6、SC2: Status and Control Register 2

状态和控制寄存器2 (SC2)包含ADC模块的转换激活、硬件/软件触发选择、比较功能和电压参考选择

Field

Name

Description

0-1

REFSEL

参考电压选择

2

DMAEN

DMA使能

3

ACREN

配置compare函数,检查被监视的输入的转换结果是否在ACFGT值决定的CV1和CV2的范围之内或之外。

4

ACFGT

配置比较功能,根据ACREN的值对比CV1和CV2的转换结果

5

ACFE

比较功能使能

6

ADTRG

转换触发选择

7

ADACT

转换中标记位

13-14

TRGPRNUM

正在工作的触发器编号

16-19

TRGSTLAT

触发器状态

24-27

TRGSTERR

多路触发器请求出错

对比模式如下:

3.7、SC3: Status and Control Register 3

状态和控制寄存器3 (SC3)控制校准、连续转换、以及ADC模块的硬件平均功能

Field

Name

Description

0-1

AVGS

硬件平均选择

2

AVGE

硬件平均使能

3

ADCO

连续转换模式

4

CAL

ADC校准功能

3.8、BASE_OFS: BASE Offset Register

基偏移寄存器(BASE_OFS)包含校准算法用于确定偏移校准值(OFS)的偏移值。

Field

Name

Description

0-7

BA_OFS

基线偏移误差修正值

3.9、OFS: ADC Offset Correction Register

ADC偏移校正寄存器(OFS)包含校准生成的偏移误差校正值(OFS)

Field

Name

Description

0-15

OFS

偏移误差值

3.10、USR_OFS: USER Offset Correction Register

ADC用户偏移校正寄存器(USR_OFS)包含用户定义的偏移量

Field

Name

Description

0-7

USR_OFS

用户偏移误差修正值

3.11、XOFS: ADC X Offset Correction Register

ADC X偏移校正寄存器(XOFS)包含转换结果错误校正算法中使用的X偏移量

Field

Name

Description

0-5

XOFS

X偏移误差修正值

3.12、YOFS: ADC Y Offset Correction Register

ADC Y偏移校正寄存器(YOFS)包含转换结果错误校正算法中使用的Y偏移量

Field

Name

Description

0-5

YOFS

Y偏移误差修正值

3.13、G: ADC Gain Register

增益寄存器(G)包含整个转换的增益误差校正

Field

Name

Description

0-10

G

增益误差调整因子的整体转换

3.14、UG: ADC User Gain Register

用户增益寄存器(G)包含用户增益误差校正

Field

Name

Description

0-9

UG

用户增益误差调整因子

3.15、CLPS: ADC General Calibration Value Register S

通用校准值寄存器(CLPx)包含由校准函数生成的校准信息

Field

Name

Description

0-6

CLPS

校准值

3.16、CLP3: ADC Plus-Side General Calibration Value Register 3

Field

Name

Description

0-9

CLPS3

校准值

3.17、CLP2: ADC Plus-Side General Calibration Value Register 2

Field

Name

Description

0-9

CLP2

校准值

3.18、CLP1: ADC Plus-Side General Calibration Value Register 1

Field

Name

Description

0-9

CLP1

校准值

3.19、CLP0: ADC Plus-Side General Calibration Value Register 0

Field

Name

Description

0-9

CLP0

校准值

3.20、CLPX: ADC Plus-Side General Calibration Value Register X

Field

Name

Description

0-6

CLPX

校准值

3.21、CLP9: ADC Plus-Side General Calibration Value Register 9

Field

Name

Description

0-6

CLP9

校准值

3.22、CLPS_OFS: ADC General Calibration Offset Value Register S

Field

Name

Description

0-3

CLPS_OFS

电容偏移校正值

3.23、CLP3_OFS: ADC Plus-Side General Calibration Offset Value Register 3

Field

Name

Description

0-3

CLP3_OFS

电容偏移校正值

3.24、CLP2_OFS: ADC Plus-Side General Calibration Offset Value Register 2

Field

Name

Description

0-3

CLP2_OFS

电容偏移校正值

3.25、CLP1_OFS: ADC Plus-Side General Calibration Offset Value Register 1

Field

Name

Description

0-3

CLP1_OFS

电容偏移校正值

3.26、CLP0_OFS: ADC Plus-Side General Calibration Offset Value Register 0

Field

Name

Description

0-3

CLP0_OFS

电容偏移校正值

3.27、CLPX_OFS: ADC Plus-Side General Calibration Offset Value Register X

Field

Name

Description

0-11

CLPX_OFS

电容偏移校正值

3.28、CLP9_OFS: ADC Plus-Side General Calibration Offset Value Register 9

Field

Name

Description

0-11

CLP9_OFS

电容偏移校正值

3.29、SC1AA - SC1Z: ADC Status and Control Register 1

SC1A用于软件和硬件触发模式的操作。

Field

Name

Description

0-5

ADCH

输入通道选择

6

AIEN

转换完成中断使能

7

COCO

转换完成标记

3.30、RAA - RZ: ADC Data Result Registers

数据结果寄存器(Rn)包含通道ADC转换的结果

Field

Name

Description

0-11

D

数据结果

3.31、SIM_ADCOPT: ADC Options Register

此寄存器是那选择ADC触发器,在SIM章节下

Field

Name

Description

0

ADC0TRGSET

ADC0触发器选择

1-3

ADC0SWPRETRG

ADC0软件预触发源

4-5

ADC0PRETRGSEL

ADC0预触发源选择

ADC1从bit 8开始,内容一样

3.32、TRGMUX_ADC0:TRGMUX ADC0 Register

此及寄存器是触发器输入源的选择,其中

Field

Name

Description

 

SELx

触发器输入源选择

31LKTRGMUX寄存器上锁

其中SELx定义为:

再后面全是保留位

4、代码编写

  1. #include "S32K144.h"
  2. #include "led.h"
  3. #include "key.h"
  4. #include "uart.h"
  5. #include "clocks.h"
  6. #include "lptmr.h"
  7. #include "lpit.h"
  8. #include "systick.h"
  9. #include "rtc.h"
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <stdlib.h>
  13. #include "ftm.h"
  14. #include "pdb.h"
  15. uint32_t ADC_RawResult;
  16. uint16_t ADC_mVResult;
  17. void adc_software_trigger(void)
  18. {
  19. PCC->PCCn[PCC_ADC0_INDEX] &=~ PCC_PCCn_CGC_MASK; /* Disable clock to change PCS */
  20. PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_PCS(1); /* PCS=1: Select SOSCDIV2 */
  21. PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_CGC_MASK; /* Enable bus clock in ADC */
  22. ADC0->SC1[0] |= ADC_SC1_ADCH_MASK; /* ADCH=1F: Module is disabled for conversions */
  23. /* AIEN=0: Interrupts are disabled */
  24. ADC0->CFG1 |= ADC_CFG1_ADIV_MASK
  25. | ADC_CFG1_MODE(1); /* ADICLK=0: Input clk=ALTCLK1=SOSCDIV2 */
  26. /* ADIV=0: Prescaler=1 */
  27. /* MODE=1: 12-bit conversion */
  28. ADC0->CFG2 = ADC_CFG2_SMPLTS(12); /* SMPLTS=12(default): sample time is 13 ADC clks */
  29. ADC0->SC2 = 0x00000000; /* ADTRG=0: SW trigger */
  30. /* ACFE,ACFGT,ACREN=0: Compare func disabled */
  31. /* DMAEN=0: DMA disabled */
  32. /* REFSEL=0: Voltage reference pins= VREFH, VREEFL */
  33. ADC0->SC3 = 0x00000000; /* CAL=0: Do not start calibration sequence */
  34. /* ADCO=0: One conversion performed */
  35. /* AVGE,AVGS=0: HW average function disabled */
  36. while(1){
  37. /* Initiate new conversion by writing to ADC0_SC1A(ADCH) */
  38. ADC0->SC1[0] = ADC_SC1_ADCH(2); /* ADCH = 2: External channel 2 as input */
  39. /* Wait for latest conversion to complete */
  40. while(((ADC0->SC1[0] & ADC_SC1_COCO_MASK)>>ADC_SC1_COCO_SHIFT) == 0);
  41. ADC_RawResult = ADC0->R[0]; /* Read ADC Data Result A (ADC0_RA) */
  42. ADC_mVResult = (ADC_RawResult * 5000) / (1<<12); /* Convert to mV (@VREFH = 5V) */
  43. }
  44. }
  45. void adc_pdb_trigger(void)
  46. {
  47. PCC->PCCn[PCC_ADC0_INDEX] &=~ PCC_PCCn_CGC_MASK; /* Disable clock to change PCS */
  48. PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_PCS(1); /* PCS=1: Select SOSCDIV2 */
  49. PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_CGC_MASK; /* Enable bus clock in ADC */
  50. /******************************************************
  51. * Initialize ADC0:
  52. * External channel 2, hardware trigger,
  53. * single conversion, 12-bit resolution
  54. *
  55. * NOTE: ADC0->SC1[4] corresponds to ADC0_SC1E register
  56. ******************************************************/
  57. ADC0->SC1[4] |= ADC_SC1_ADCH_MASK; /* ADCH=1F: Module is disabled for conversions */
  58. ADC0->CFG1 |= ADC_CFG1_ADIV_MASK
  59. | ADC_CFG1_MODE(1); /* ADICLK=0: Input clk=ALTCLK1=SOSCDIV2 */
  60. ADC0->CFG2 = ADC_CFG2_SMPLTS(12); /* SMPLTS=12(default): sample time is 13 ADC clks */
  61. ADC0->SC2 = ADC_SC2_ADTRG(1); /* ADTRG = 1: HW trigger */
  62. ADC0->SC1[4] = ADC_SC1_ADCH(2); /* ADCH = 2: External channel 2 as ADC0 input */
  63. ADC0->SC3 = 0x00000000; /* CAL=0: Do not start calibration sequence */
  64. /* ADCO=0: One conversion performed */
  65. /* AVGE,AVGS=0: HW average function disabled */
  66. /************************************************
  67. * Initialize PDB0:
  68. * 1 second period, continuous mode
  69. * PDB0_CH0 pre-trigger 4 output enabled
  70. ************************************************/
  71. PCC->PCCn[PCC_PDB0_INDEX] |= PCC_PCCn_CGC_MASK; /* Enable bus clock in PDB */
  72. PDB0->SC = PDB_SC_PRESCALER(6) /* PRESCALER = 6: clk divided by (64 x Mult factor) */
  73. | PDB_SC_TRGSEL(15) /* TRGSEL = 15: Software trigger selected */
  74. | PDB_SC_MULT(3) /* MULT = 3: Multiplication factor is 40 */
  75. | PDB_SC_CONT_MASK; /* CONT = 1: Enable operation in continuous mode */
  76. /* S32K 参考手册 1161页有写PDBn CHn对应的ADCn_SC1寄存器 */
  77. PDB0->MOD = 15625;
  78. PDB0->CH[0].C1 = (PDB_C1_TOS(0x10) /* TOS = 10h: Pre-trigger 4 asserts with DLY match */
  79. | PDB_C1_EN(0x10)); /* EN = 10h: Pre-trigger 4 enabled */
  80. PDB0->CH[0].DLY[4] = 15625; /* Delay set to half the PDB period = 9375 */
  81. PDB0->SC |= PDB_SC_PDBEN_MASK | PDB_SC_LDOK_MASK; /* Enable PDB. Load MOD and DLY */
  82. PDB0->SC |= PDB_SC_SWTRIG_MASK; /* Single initial PDB trigger */
  83. while(1){
  84. /* Wait for latest conversion to complete */
  85. while(((ADC0->SC1[4] & ADC_SC1_COCO_MASK)>>ADC_SC1_COCO_SHIFT) == 0);
  86. ADC_RawResult = ADC0->R[4]; /* Read ADC Data Result E (ADC0_RE) */
  87. ADC_mVResult = (ADC_RawResult * 5000) / (1<<12); /* Convert to mV (@VREFH = 5V) */
  88. }
  89. }
  90. void adc_trgmux_trigger(void)
  91. {
  92. PCC->PCCn[PCC_ADC0_INDEX] &=~ PCC_PCCn_CGC_MASK; /* Disable clock to change PCS */
  93. PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_PCS(1); /* PCS=1: Select SOSCDIV2 */
  94. PCC->PCCn[PCC_ADC0_INDEX] |= PCC_PCCn_CGC_MASK; /* Enable bus clock in ADC */
  95. ADC0->SC1[0] |= ADC_SC1_ADCH_MASK; /* ADCH=1F: Module is disabled for conversions */
  96. ADC0->CFG1 |= ADC_CFG1_ADIV_MASK
  97. | ADC_CFG1_MODE(1); /* ADICLK=0: Input clk=ALTCLK1=SOSCDIV2 */
  98. ADC0->CFG2 = ADC_CFG2_SMPLTS(12); /* SMPLTS=12(default): sample time is 13 ADC clks */
  99. ADC0->SC2 = ADC_SC2_ADTRG(1); /* ADTRG = 1: HW trigger */
  100. ADC0->SC1[0] = ADC_SC1_ADCH(12); /* ADCH = 12: External channel 12 as ADC0 input */
  101. ADC0->SC3 = 0x00000000; /* CAL=0: Do not start calibration sequence */
  102. /* ADCO=0: One conversion performed */
  103. /* AVGE,AVGS=0: HW average function disabled */
  104. /************************************************
  105. * Configure pin PTB5 as TRGMUX_IN0
  106. ************************************************/
  107. PCC->PCCn[PCC_PORTA_INDEX] = PCC_PCCn_CGC_MASK; /* Enable clock gate for PORTB */
  108. PORTA->PCR[6] = PORT_PCR_MUX(6); /* Mux = 6: PTB5 as TRGMUX_IN0 */
  109. /* Select TRGMUX_IN0 as ADC0 Trigger Mux input source 0 */
  110. TRGMUX->TRGMUXn[TRGMUX_ADC0_INDEX] = TRGMUX_TRGMUXn_SEL0(2U);
  111. /************************************************
  112. * SIM Configurations for ADC triggering:
  113. * Pre-trigger source: Software pre-trigger
  114. * Trigger select: TRGMUX output
  115. ***********************************************/
  116. SIM->ADCOPT = SIM_ADCOPT_ADC0PRETRGSEL(2) /* ADC0PRETRGSEL = 10b: Software pretrigger */
  117. | SIM_ADCOPT_ADC0SWPRETRG(4) /* ADC0SWPRETRG = 100b: SW Pre-trigger 0 */
  118. | SIM_ADCOPT_ADC0TRGSEL(1); /* ADC0TRGSEL = 1: TRGMUX output as trigger */
  119. while(1){
  120. /* Wait for latest conversion to complete */
  121. while(((ADC0->SC1[0] & ADC_SC1_COCO_MASK)>>ADC_SC1_COCO_SHIFT) == 0);
  122. ADC_RawResult = ADC0->R[0]; /* Read ADC Data Result E (ADC0_RE) */
  123. ADC_mVResult = (ADC_RawResult * 5000) / (1<<12); /* Convert to mV (@VREFH = 5V) */
  124. }
  125. }
  126. int main(void)
  127. {
  128. WDOG_disable(); /* Disable WDOG */
  129. SOSC_init_8MHz(); /* Initialize system oscilator for 8 MHz xtal */
  130. SPLL_init_160MHz(); /* Initialize SPLL to 160 MHz with 8 MHz SOSC */
  131. NormalRUNmode_80MHz(); /* Init clocks: 80 MHz sysclk & core, 40 MHz bus, 20 MHz flash */
  132. adc_pdb_trigger();
  133. while(1){
  134. }
  135. return 0;
  136. }

此篇是软件触发->pdb触发->pdb触发in back-to-back mode->TRGMUX触发->LPIT触发

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/144626
推荐阅读
相关标签
  

闽ICP备14008679号