最近学习了单片机的采样过程,结合学习材料记录总结了具体过程,记录了学习过程,方便以后复习。 dsPIC33EP128MC506单片机有一台ADC模块最多可支持16个模拟输入引脚ADC模块配置为10位4通道采样/保持,12位单通道采样/保持模式。
- 逐次逼近(Successive Approximation Register SAR)转换
- 最高转换速度可达1.1 Msps
- 同时采样: 最多4个模拟输入引脚
- 可选择转换接触源
- 四个结果对齐选项(有符号/无符号,小数/整数)
- 输入电压信号连接到采样电阻
- 断开采样电容器与输入连接,
- 存储的电压值得数字位置
Start of conversion 开始转换
1.采样时间是模拟输入连接到采样电容的时间
2.在转换周期内,采样电容断开与多路开关连接,存储的电压等值为转换时间。
模式1:手动采样和手动转换
- 将SAMP位(ADCCON1<1>)置1启动采样;
- 将SAMP位清零开始转换;
- 转换完成;
- 将SAMP位置1启动采样;
- 将SAMP位清零开始转换
模式2:自动采样和手动转换
- 采样将在前一个采样的转换完成之后自动开始
- 将SAMP位清零开始转换
- 转换完成。采样将在前一次采样转换完成后自动开始
- 将SAMP位清零开始转换
模式3:自动采样和自动转换
- 转换后自动启动采样
- 自定时采样周期终止时自动启动转换
- 转换后自动启动采样
- 自定时采样周期终止时自动启动转换
- 选定的模拟输入连接到采样电阻
- 发生SOC触发时,CH0-CH采样电容器从多路开关断开,同时采样模拟输入。CH0中捕获的模拟值转换等值的数字位
- 3/4/5 CH模拟电压在1/2/3中被转换为等值的数字位
- 选定的模拟输入连接到采样电容器
- 发生SOC触发时,CH0-CH采样电容器从多路开关断开,同时采样模拟输入。CH0中捕获的模拟值转换等值的数字位
为了使ADC当模块达到规定的精度时,必须保持充电电容CH0LD充分充电至模拟输入引脚上的电压。模拟输出信号源阻抗RS、电影中等效电阻的布线RIC阻抗内部采样开关RSS共同直接影响电容CH0LD充电所需的时间。因此,合并的源阻抗必须足够小,以便在电容在所选采样时间内完全放电。为了将引脚泄漏电流对准ADC最块精度的影响最小化,建议使用最大信号源阻抗RS为200R。在选择模拟输入通道后,必须在启动转换前完成采样工作。每次采样操作前,内部电容将保持放电。
RAM数据自动格式化为10位或12位宽的四种可选格式之一。FORM<1:0>位(AD1CON1<9:8>)用于选择格式。格式化硬件为数据总线上的所有数据格式提供16个结果
- 禁止ADC模块-AD1CON1<15> = 0;
2. AD1CON1寄存器配置-AD1CON1 = 0x001c;
- ADC继续在空闲模式下工作(ADSIDL = 0)
- 选择10位4通道ADC工作模式(AD12B = 0)
- 数据输出格式为整数(FORM<1:0> == 0)
- 采样触发源选择PWM发生器1主触发比较结束,启动转换(SSRCG =1, SSRC<2:0> == 000)
- 同时采样CH0/1/2/3(SIMSAM = 1)
- 上次转换结束后立即开始采样;SAMP位自动置1(ASAM = 1)
3. AD1CON2寄存器配置-AD1CON2 = 0x0200
- 转换器参考电压选择VREFH为AVDD, VREFL为AVSS(VCFG<2:0> = 000)
- 选择转换通道CH0/1/2/3(CHPS<1:0> = 10)
- 每次采样/转换操作完成后中断(SMPI<4:0> = 0000)
- 缓冲区总是从起始地址开始填充(BUFM = 0)
- 采样多路开关总是开关MUXA选择输入通道
4. AD1CON3寄存器配置-AD1CON3 = 0x0004
- ADC转换时钟源的选择由系统时钟产生(ADRC = 0)
- 自动采样时间为0TAD(SAMC<4:0> = 00000)
- ADC选择转换时钟TAD = 5*Tp(ADCS<7:0> = 00000100)
5. AD1CON4寄存器配置-AD1CON4 = 0x0000(不使用DMA)
- 禁止DMA(ADDMAEN = 0)
- 不使用DMA缓冲单元(DMABL<2:0> = 000)
6 . AD1CHS123寄存器配置-AD1CHS123 = 0x0000
7. AD1CHS0寄存器配置-AD1CHS0 = 0x0303
8. AD1CSSH寄存器配置-AD1CSSH = 0x0000
9. AD1CSSL寄存器配置-AD1CSSL = 0x0000
10. 使能ADC模块-AD1CON1<15> = 1
配置步骤:
- I0端口的配置
RB8配置为模拟输入引脚(已初始化)
- 参考电压输出配置CVRCON-CVRCON = 0x00c8
- 使能比较器参考电压(CVREN = 1)
- 参考电压1输出比较器(CVR10E = 1)
- 比较器参考电压范围选择CVRSRC/32步长(CVRR = 0)
- 比较器参考电压源的选择CVRSRC = AVDD-AVSS(CVRSS&nsp; = 0)
- 比较器参考电压值为8(CVR<3:0> = 1000)
ADC模块时钟源选择系统时钟源,配置ADC1位4通道自动同时采样模式,并使用PWM发生器1主触发比较结束采样并开始转换。数据格式为整数格式,CH0通道依次选择AN3(Vbus)、AN4(旋钮电压)、AN6(Ibus),初始配置选择AN3,CH1/2/3通达固定选择AN0(Ia)、AN1(Ib)、AN2(Ic),转换完成需要进行转换完成中断,在中断种将转换完成的结果使用SPI1模块传送到4个ADC输出通道,将转换结果与实际结果对比是否正确。、
static void INIT_SECTION McuCompInitialize(void)
{
CVRCON = CVRCON_INIT; //配置为0x0c8
}
static void INIT_SECTION McuAdcInitialize(void)
{
AD1CON1bits.ADON = 0;
//禁止ADC模块
AD1CON1 = AD1CON1_INIT;
//0x001c 选择10位4通道采样,数据输出格式为无符号整型,PWM发烧友衡器1主触发结束采样并开始转换,自动采样
AD1CON2 = AD1CON2_INIT;
//0x0200 转换器参考电压为 VREFH AVDD VREFL AVSS 转换通道选择CH0/1/2/3 使用MUXA选择的输入通道
AD1CON3 = AD1CON3_INIT;
//0x0004 ADC转换的时钟源选择系统时钟 自动采样时间为0TAD ADC转换时钟TAD = 5Tp = 5*16.6ns = 83.3ns
AD1CON4 = AD1CON4_INIT;
//0x0000 不使用DMA
AD1CHS123 = AD1CHS123_INIT;
// 0x0000 CH1-CH3 MUXA/B 反向输入端选择VREFL 同向输入端选择AN0/AN1/AN2
AD1CHS0 = AD1CHS0_INIT;
//0x0303 CH0 MUXA/B 反向输入端选择VREFL 同向输入端选择AN3
AD1CSSH = AD1CSSH_INIT;
//0x0000 没有使用通道扫描
AD1CSSL = AD1CSSL_INIT;
//0x0000 没有使用通道扫描
AD1CON1bits.ADON = 1;
//使能ADC模块
}
static void INIT_SECTION McuIntInitialize(void)
{
IFS0bits.AD1IF = 0; //中断标志位清零
IPC3bits.AD1IP = 7; //配置为最高的优先级
IEC0bits.AD1IE = 1; //中断允许位
}
void __attribute__((section(".main_section"),interrupt,shadow,no_auto_psv)) _AD1Interrupt(void)
{
IFS0bits.AD1IF = 0;//清除ADC转换完成的中断标志位
/*--------------------用户代码区-------------------------------------*/
LED0_PIN = LED_ON;
GetAdcValue();//获取ADC转换结果
SentReceData();//串口发送接收处理
SpiTransmit();//SPI传输数据
CountDowmTimer();//计数器
LED0_PIN = LED_OFF;
/*-------------------用户代码区结束---------------------------------*/
}