[MCU] 【AutoChips AC7801x电机demo板测评】+ 不可或缺的模数转换器(ADC)

仙景   2020-11-12 23:39 楼主

序言: 现实生活中,很多能听到的,看到的都是模拟量,连续的。但我们需要观察这些现象的变化,那就是通过一些工具,让其变化可观测量,那这个过程中,模数转换器ADC担任着重要的角色。而杰发AC7801片上的ADC 模块是 12 位逐次逼近型模拟数字转换器,拥有 12 路外部通道和 2 路内部通道,支持单次、连续、扫描或间断转换多种模式。

特性与结构:

12 位分辨率
ADC 通道输入电压范围: AVSS < Vin < AVDD
最大转换速率: 1Msps
14 路通道: 12 路外部通道, 1 路内部温度传感器( T-Sensor), 1 路内部带隙基准电压
Bandgap) ,每路通道可单独配置采样时间
转换序列分为 规则组(regular group) 和注入组(injection group
- 规则组:最多可配置 12 个通道
- 注入组:最多可配置 4 个通道
8 种操作模式 (方便起见, 称为 mode xx=1~8)
- 规则组单通道单次转换(mode1)
- 规则组单通道连续转换(mode2)
- 规则组扫描+注入组扫描模式多通道单次转换(mode3 注入组扫描模式)
- 规则组扫描+注入组间隔模式多通道单次转换(mode3 注入组间隔模式)
- 规则组扫描+自动触发注入组扫描模式多通道单次转换(mode4)
- 规则组扫描+注入组扫描模式多通道连续转换(mode5 注入组扫描模式)
- 规则组扫描+注入组间隔模式多通道连续转换(mode5 注入组间隔模式)
- 规则组扫描+自动触发注入组扫描模式多通道连续转换(mode6)
- 规则组子组扫描模式转换(mode7)
- 注入组子组扫描模式转换(mode8)

通过内部软件触发或外部硬件触发启动 ADC
中断:
- 规则或注入组转换结束(EOCEnd Of Conversion)
- 注入组转换结束(IEOC)
- 模拟监控器事件(AMO)
DMA 访问, 仅用于规则组通道
 

ADC 模块:分为如下几部分: ADC 时钟, ADC 采样选择, ADC 转换, ADC 模式配置, ADC 触发源选
择, ADC 监控, ADC 中断。 下图为 ADC 模块框图。

ADC_结构框图.png

由上面的框图,我们可以看出ADC关键的寄存器

状态寄存器(ADC_STR)

模拟监控异常发生、恢复事件标志(AMO,AAMO,NAMO),ADC 空闲状态标志(IDLE),规则组、注入组转换完成标志(EOC,IEOC)。主要用EOC,IEOC完成标志

控制寄存器(ADC_CTRL0,ADC_CTRL1)

控制寄存器 0(control register0)
-规则组、注入组触发配置(SWSTART,ISWSTART,EXTTRIG,IEXTTRIG)
-工作模式配置(SCAN,CONT,DISCEN,IDISCEN,IATUO,INTERVAL)
-模拟监控器触发模式配置(AMOMODE)
-模拟监控通道配置(AMOEN,IAMOEN,AMOSGL)
-模拟监控通道设置(AMOCH)
-数据对齐方式(ALIGN)
-DMA 功能使能(DMAEN)
-中断功能使能(AMOIE,EOCIE,IEOCIE)
-通道不连续转换长度设置(DISCNUM)

控制寄存器 1(control register1)
-ADC 总线时钟预分频设置(PSC[3:0])
-校准使能(CALEN)
-ADC 上电(ADON)
剩下的太多,自己去看手册,哈哈……

CTU 模块

这里要说一下CTU模块,是专门用来配置ADC触发。从 ADC 功能可知,不管是规则组还是注入组, ADC 转换的触发方式都有两种:内部软件触发,外部硬件触发。外部硬件触发与其他模块相关联。这种模块间的互联操作需要配置 CTU 模块。
CTU 模块特性:
1) ACMP0 输出捕获
2) UART0_TX 调制
3) UART0_RX 捕获
4) UART0_RX 滤波
5) RTC 捕获
6) ADC 触发
7) PWM 软件同步

CTU_ADC1.png

ADC 硬件触发

ADC_硬件触发.png

下面,我们开始操作电机DEMO板ADC去进行采样滑动电阻的变化:

GPIO_SetFunc(GPIOC, GPIO_PIN1, GPIO_FUN2);///<ADC_IN9 Analog function enable
adcConfig->clkPsc = ADC_CLK_PRESCALER_1; ///<Set ADC Clk = 24M/2/(0+1)
adcConfig->scanModeEn = ENABLE;                   //扫描模式
adcConfig->continousModeEn = DISABLE;             //连续模式
adcConfig->regularDiscontinousModeEn = DISABLE;   //1:打开规则组间断转换模式
adcConfig->injectDiscontinousModeEn = DISABLE;    //1:打开注入组间断转换模式
adcConfig->injectAutoModeEn = DISABLE;            //1:自动注入模式
adcConfig->intervalModeEn = DISABLE;              //1:注入组为间隔转换模式
adcConfig->regularDiscontinousNum = 0;            //
adcConfig->EOCInterruptEn = DISABLE;              //EOC中断去能
adcConfig->IEOCInterruptEn = DISABLE;             //IEOC中断去能
adcConfig->interruptEn = DISABLE;                 //去能中断
adcConfig->regularDMAEn = ENABLE;                 //使能ADC DMA
adcConfig->regularTriggerMode = ADC_TRIGGER_EXTERNAL;//ADC触发源,外部触发
adcConfig->injectTriggerMode = ADC_TRIGGER_INTERNAL; //ADC触发源,内部触发
adcConfig->regularSequenceLength = 1;               //规则组长度设为1
adcConfig->injectSequenceLength = 0;               //注入组长度设为0
adcConfig->dataAlign = ADC_DATA_ALIGN_RIGHT;       //右对齐
adcConfig->powerMode = ADC_POWER_ON;               //上电
ADC_Init(ADC0, adcConfig);                      ///<ADC works Mode Config

还有配置ADC_CTU模块去触发

CTU_ConfigType ctuConfig;
memset(&ctuConfig, 0x00, sizeof(ctuConfig));
ctuConfig.uart0RxFilterEn = DISABLE;  //去能UART0_RX滤波
ctuConfig.rtcCaptureEn = DISABLE;  //去能RTC捕获
ctuConfig.acmpCaptureEn = DISABLE;  //去能ACMP捕获
ctuConfig.uart0RxCaptureEn = DISABLE;  //去能UART0_RX捕获
ctuConfig.uartTxModulateEn = DISABLE;  //去能UART0_TX调制
ctuConfig.clkPsc = CTU_CLK_PRESCALER_1;  //分频
ctuConfig.adcRegularTriggerSource = CTU_TRIGGER_ADC_TIMER_CH0_OVERFLOW; //Timer0触发ADC规则组采样。
//ctuConfig.adcInjectTriggerSource = CTU_TRIGGER_ADC_PWM0_INIT;  //
ctuConfig.delay0Time = 0;  //触发延迟

CTU_Init(&ctuConfig);

然后进行采样,把数据读出,打印出来

void sampleValueDeal(void)
{
    int i;
    uint32_t sumValue = 0;
    for (i = 0; i < DMA_TRANSFER_NUM; i++)
    {
        sumValue += g_ADCValueBuffer;
    }
    g_averageSampleValue = sumValue / DMA_TRANSFER_NUM;
}

请看演示:

 

ADC采样数据printf.gif

 

ADC分享贴完成,下一个请看下面分享

本帖最后由 仙景 于 2020-11-13 10:15 编辑

回复评论 (1)

沙发

点赞  2020-11-13 10:27
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复