在使用APM32F035来做电机应用时,虽然APM32F035和APM32F030都属于Arm-Cortex-M0+内核,但是在ADC采样方式部分还是有一些区别的,以下针对问题以及性能做简单阐述。
案例:在应用ADC-DMA进行采样时,在DMA采样完成中断内,切换ADC通道,再配置DMA开启新的采样,在若干次后,出现ADC不动作情况。
中断处理如下:
void DMA_CH1_IRQHandler(void)
{
static u32 L_Adc_Channe1Temp
DMA->INTFCLR |= DMA_FLAG_TF1;
if(SampletestState == SAMPLE_1) // 当前采样的是电流
{
SampletestState = NOR SAMPLE // 普通采样
ADC->CTRL B.ADCEN = 0; DMA CHANNEL 1->CHCFG B.CHEN=0 //关闭DMA通道1_
DMA_CHANNEL_1->CHNDATA =ADC1ResultNum; // 平均
DMA_CHANNEL_1->CHMADDR = (u32)ADC1Resu1lt_Table; // 指定DMA的内存目标地址
Adc Channe1Temp =ADC->CHSEL:
ADC->CHSEL = IAVR_CURRENT_CHANNEL |VC_VOLTAGE_CHANNEL|VA_VOLTAGE_CHANNEL|VB_VOLTAGE_CHANNEL |VOLTAGE_CHAI
ADC->CFG1_B.EXTPOLSEL1= ADC_EXT_TRIG_EDGE_NONE; //指定外音
DMA_CHANNEL_1->CHCFG_B.CHEN =1; // 使能DMA通道1
ADC->CTRL_B.ADCEN = 1; // 使能ADC
ADC->CTRL_B.STARTCEN = 1; // 置ADSTART标志,
}
// 当前采样的是反电
else{
SampleState = CUR SAMPLE // 电流采样
ADC->CTRL B.ADCEN = 0; // 关闭ADC
DMA CHANNEL 1->CHCFG B.CHEN = 0; // 关闭DMA通道1
DMA CHANNEL 1->CHNDATA= 2: // 平均电流基准需要
DMA_CHANNEL_1->CHMADDR = (u32)ADC1CurResult_Table // 指定DMA的内存目
ADC->CHSEL = L_Adc_Channe1Temp: // 只采峰值电流通道
ADC->CFG1_B.EXTPOLSEL1= ADC_EXT_TRIG _EDGE _RISING: //指定外音
DMA_CHANNEL_1->CHCFG_B.CHEN = 1; // 使能DMA通道1
ADC->CTRL_B.ADCEN = 1; // 使能ADC
ADC->CTRL_B.STARTCEN = 1; // 置ADSTAI
}
}
问题点:由于多次切换问题,可能会存在软件端使能了ADC,但是ADC硬件并未准备好,ADC就开始采样时,导致ADC溢出挂掉。
改进点:在切换ADC失能,并失能后,加入判断ADC是否已经准备好的判定条件。
while(ADC->STS_B.ADCRDY** !=1){}; 可以在ADCEN后判断下ADC状态。
ADC分段采样模式区别:
断续模式---APM32F030x6x8
配置寄存器 ADC_CFG1 的 DISCEN 位置 1, ADC 设置为断续模式;通过软件或硬件的触发事件开启 ADC 转换。该模式下每次只转换一个序列中的一个通道,
若 DISCEN 位清零,则每次转换一个序列的所有通道。
例如:
- 1st 触发,通道 0 被转换并且产生一个 EOC** 事件
- 2nd 触发,通道 1 被转换并且产生一个 EOC** 事件
- 3rd 触发,通道 5 被转换并且产生一个 EOC** 事件
- 1st 触发,通道 0,1,5 按顺序依次被转换,每个通道转换完产生一个
EOC** 事件,整个序列转换完成后产生一个 EOSEQ** 事件
序列分段模式---APM32F035x8
数据对齐方式为左对齐或右对齐,配置寄存器 ADC_CFG1 的 DALIGCFG 位决定, DALIGCFG 为 0 右对齐, DALIGCFG 为 1 左对齐。 ADC 转换结果可以左对齐或右对齐存储在 16 位数据寄存器中。序列分段采样模式的数据存储在 ADC_DATA(0-18)的寄存器,可左右对齐。
例如:配置 3 段序列采样,第一段通道总数为 1(采样通道 0),第二段通道总数为 2(采样通道 1, 0),第三段通道总数为 3(采样通道 2, 3, 1),(配置
ADC_SEQ_NUM = 0x20000820; ADC_CHANNEL1.CH0=0;
ADC_CHANNEL1.CH1=1, ADC_CHANNEL1.CH2=0;
ADC_CHANNEL1.CH3=2, ADC_CHANNEL1.CH4=3,
ADC_CHANNEL1.CH5=1),则第一段的数据结果将出现在 ADC_DATA0, 第二段的数据结果将出现在 ADC_DATA1-2, 第三段的数据结果将出现在
ADC_DATA3-5,虽然 ADC 分段采样模式支持乱序(即第二、三段采样可先于第一段),但每段对应的结果寄存器的对应关系是固定的(例如,配置完成后开启
ADC,若 ADC 首先接收第三段采样对应的硬件触发,则该段采样结束后模拟通道 2 的结果将出现在 ADC_DATA3,模拟通道 3 的结果将出现在 ADC_DATA3,
模拟通道 1 的结果将出现在 ADC_DATA5)。
这两种模式,区别在于断续模式只支持每个序列采样一个通道,且存在在同一个Data寄存器内,以防止数据被覆盖需要快速读取。而序列分段模式,支持每个序列多个通道采样,且对应不同的序列都会存放在对应通道的Data寄存器内,方便用到后在读取,对于电机应用较为便利。
|