您好!
我已经编写了一个代码、用于使用来自电压和电流传感器的 DMA 获取 ADC 值。 我目前正在使用 MODOSC、根据数据表、该 MODOSC 的频率为5MHz、采样保持时间为16个 ADC 周期。
那么,有效采样时间是1/5MHz*16=3.2us (不考虑延迟周期)是正确的吗?
DMA 是否可与其他时钟模式配合使用、例如辅助时钟、主系统或子系统主时钟? 使用这些时钟时、我没有获得正确的 ADC 值? 下面是我对 ADC 和 DMA 以及 main 中用于获取 ADC 值的 while 循环所做的配置代码。
while (1)
{
while (ADC10CTL1 & BUSY);//如果 ADC10内核处于活动状态则等待
ADC10CTL0 |= ADC10ENC + ADC10SC;//采样和转换准备就绪
_bis_SR_register (CPUOFF + GIE);// LPM0、ADC10_ISR 将强制退出
//__delay_cycles (5000);//序列转换之间的延迟
__no_operation ();//断点;检查 ADC_Result
}
/配置 ADC 通道
void SetADC (){
ADC10CTL0 = ADC10SHT_2 + ADC10MSC + ADC10ON;// 16xADC 时钟周期、多采样转换、ADC10ON
ADC10CTL1 = ADC10SSEL_0+ADC10SHP+ ADC10CONSEQ_1;// ADCCLK = MODOSC;采样信号来源于采样定时器、单次序列
ADC10CTL2 = ADC10RES;// 10位转换结果
ADC10MCTL0= ADC10INCH_8 + ADC10SREF_1;//选择 ADC 通道;使用 VR+= VREF 和 VR-= AVSS
//默认情况下、REFMSTR=1 => REFCTL 被用来配置内部基准
while (REFCTL0 & REFGENBUSY);//如果基准发生器忙,请等待
REFCTL0 |= REFVSEL_2 + REFON;//选择内部基准= 2.5V
_DELAY_CYCLS (75);//参考建立延迟(~75us)-ADC10采样和转换=(32+13)*2/SMCLK = 90/SMCLK = 75us
}
void SetDMA(){
//配置 DMA0 (ADC10IFG 触发器)
DMACTL0 = DMA0TSEL_24;// ADC10IFG 触发器
__data20_write_long ((uintptr_t)&DMA0SA、(uintptr_t)&ADC10MEM0);//源单地址
__data20_write_long ((uintptr_t)&DMA0DA、(uintptr_t)&ADC_Result [0]);//更新目标数组地址
DMA0SZ = 0x09;// 8次转换-字节或字传输的数量
谢谢你。
DMA0CTL = DMADT_4 + DMADSTINCR_3 + DMAEN + DMAIE;// Rpt、inc dest、字节访问、在转换序列后启用 int
}