#include "common.h"
void ADCInitialization(void)
{
// ADCON1bits.DONE = 0x00; //A/D 转换状态位
//1 = A/D 转换完成
//0 = A/D 转换未完成
//将此位清零不会影响进行中的任何操作。
//此位由软件或开始新转换清零
ADCON1bits.SAMP = 0x00; //A/D 采样使能位
//1 = 至少一个A/D 采样/ 保持放大器正在采样
//0 = A/D 采样/ 保持放大器正在保持
//当ASAM = 0 时,此位写入1 将开始采样。
//当SSRC = 000 时,此位写入0 将结束采样并开始转换
ADCON1bits.ASAM = 0x00; //A/D 采样自动开始位
//1 = 采样在上一个转换结束后立即开始。SAMP 位自动置位。
//0 = 采样在SAMP 位置位后开始
ADCON1bits.SSRC = 0x01; //转换触发源选择位
//111 = 内部计数器结束采样并开始转换(自动转换)
//110 = 保留
//101 = 保留
//100 = 保留
//011 = 电机控制PWM 间隔结束采样并开始转换
//010 = 通用功能Timer3 比较结束采样并开始转换
//001 = INT0 引脚的有效电平变化结束采样并开始转换
//000 = 清除SAMP 位结束采样并开始转换
ADCON1bits.FORM = 0x00; //数据输出格式位
//11 = 有符号小数(DOUT = sddd dddd dddd 0000)
//10 = 小数(DOUT = dddd dddd dddd 0000)
//01 = 有符号整数(DOUT = ssss sddd dddd dddd)
//00 = 整数(DOUT = 0000 dddd dddd dddd)
ADCON1bits.ADSIDL = 0x00; //在空闲模式位停止
//1 = 当器件进入空闲模式时模块不继续工作
//0 = 在空闲模式模块继续工作
ADCON1bits.ADON = 0x00; //A/D 工作模式位
//1 = A/D 转换器模块正在工作
//0 = A/D 转换器已关闭
TRISBbits.TRISB9 = 0x01;
ADPCFGbits.PCFG9 = 0x00; //模拟输入引脚配置控制位
//PCFG15 PCFG14 PCFG13 PCFG12 PCFG11 PCFG10 PCFG9 PCFG8
//PCFG7 PCFG6 PCFG5 PCFG4 PCFG3 PCFG2 PCFG1
//1 = 模拟输入引脚处于数字模式,使能端口读取输入, A/D 输入多路开关输入连接到AVSS
//0 = 模拟输入引脚处于模拟模式,禁止端口读取输入,A/D 采样引脚电压
ADCHSbits.CH0NB = 0x00; //MUX B多路开关设置通道0 负输入选择位
//1 = 通道0 负输入是AN1
//0 = 通道0 负输入是VREF
ADCHSbits.CH0SB = 0x00; //MUX B 多路开关设置通道0 正输入选择位
//1111 = 通道0 正输入是AN15
//1110 = 通道0 正输入是AN14
//1101 = 通道0 正输入是AN13
//……
//0001 = 通道0 正输入是AN1
//0000 = 通道0 正输入是AN0
ADCHSbits.CH0NA = 0x01; //MUX A多路开关设置通道0 负输入选择位
//1 = 通道0 负输入是AN1
//0 = 通道0 负输入是VREF
ADCHSbits.CH0SA = 0x09; //MUX A 多路开关设置通道0 正输入选择位
//1111 = 通道0 正输入是AN15
//1110 = 通道0 正输入是AN14
//1101 = 通道0 正输入是AN13
//……
//0001 = 通道0 正输入是AN1
//0000 = 通道0 正输入是AN0
ADCSSL = 0x0000; //A/D 输入引脚扫描选择位
//CSSL15 CSSL14 CSSL13 CSSL12 CSSL11 CSSL10 CSSL9 CSSL8
//CSSL7 CSSL6 CSSL5 CSSL4 CSSL3 CSSL2 CSSL1
//1 = 选择对ANx输入进行扫描
//0 = 输入扫描时跳过ANx
ADCON3bits.ADCS = 0x0F; //A/D 转换时钟选择位
//111111 = TCY/2 * (ADCS<5:0> + 1) = 32 * TCY
//……
//000001 = TCY/2 * (ADCS<5:0> + 1) = TCY
//000000 = TCY/2 * (ADCS<5:0> + 1) = TCY/2
ADCON3bits.ADRC = 0x00; //A/D转换时钟源位
//1 = A/D内部RC 时钟
//0 = 时钟由系统时钟产生
ADCON3bits.SAMC = 0x0F; //自动采样时间位
//11111 = 31 TAD
//……
//00001 = 1 TAD
//00000 = 0 TAD
ADCON2bits.ALTS = 0x00; //交替输入采样模式选择位
//1 = 为第一个采样使用MUX A输入多路开关设置,然后对所有后续采样在MUX B和MUX A 输入多路开关
//设置之间轮换
//0 = 总是使用MUX A输入多路开关设置
ADCON2bits.BUFM = 0x00; //缓冲器模式选择位
//1 =缓冲器配置为两个8字缓冲器ADCBUF (15……8)和ADCBUF (7……0)
//0 = 缓冲器配置为一个16 字缓冲器ADCBUF (15……0)
ADCON2bits.SMPI = 0x00; //每产生一次中断的采样/转换过程数选择位
//1111 = 每完成第16 个采样/转换过程后产生中断
//1110 = 每完成第15 个采样/转换过程后产生中断
//.....
//0001 = 每完成第2 个采样/转换过程后产生中断
//0000 = 完成每个采样/ 转换过程后产生中断
// ADCON2bits.BUFS = 0x00; //缓冲器填充状态位
//仅在BUFM = 1时有效(ADRES分成2 x 8 字的缓冲器)
//1 = A/D正在填充缓冲器0x8—0xF,用户应该访问0x0—0x7 的数据
//0 = A/D正在填充缓冲器0x0—0x7,用户应该访问0x8—0xF的数据
ADCON2bits.CSCNA = 0x00; //MUX A输入多路开关设置的CH0+ S/H输入的扫描输入选择位
//1 = 扫描输入
//0 = 不扫描输入
ADCON2bits.VCFG = 0x01; //参考电压配置位
// A/D VREFH A/D VREFL
//000 AVDD AVSS
//001 外部VREF+ 引脚AVSS
//010 AVDD 外部 VREF- 引脚
//011 外部VREF+引脚 外部VREF-引脚
//1xx AVDD AVSS
IFS0bits.ADIF = 0x00; //A/D转换完成中断标志状态位
//1 = 发生中断请求
//0 = 未发生中断请求
IPC2bits.ADIP = 0x01; //A/D转换完成中断优先级位
//111 = 中断优先级为7(最高优先级中断)
//???
//001 = 中断优先级为1
//000 = 中断源被禁止
IEC0bits.ADIE = 0x00; //A/D转换完成中断允许位
//1 = 允许中断请求
//0 = 不允许中断请求
}