MC908GP32单片机B口的8根引脚与8路A/D转换模块的引脚复用,在4.2.2小节已讨论过B口作为通用I/O口的功能,并在4.3节举例说明了I/O口的编程方法。这里讨论8路A/D转换器时的编程方法。
A/D转换有个参考电压问题,在B口有引脚作为A/D转换器的输入引脚时,芯片的VREFH、VREFL引脚分别必须接参考电压的正、负,通常就是接电源的正、负端。
B口引脚作为A/D转换引脚时,也叫作AD7 pin ~AD0 pin。它们是8位A/D转换,正常A/D转换要求提供1MHz的ADC时钟频率,一次一路A/D转换时间一般为16到17个ADC时钟周期,所以一般A/D转换时间为16~17µs。
10.4.1 GP32 A/D转换模块寄存器
GP32的A/D转换模块有3个寄存器,它们是:A/D转换状态和控制寄存器(ADSCR)、A/D转换数据寄存器(ADR)、A/D转换输入时钟寄存器(ADCLK)。通过这3个寄存器的编程,就可以获取A/D转换数据。
1.A/D转换状态和控制寄存器ADSCR (Analog-to-Digital Status and Control Register)
ADSCR主要功能是:选取要转换的通道、决定转换结束数据获取的方式、设置是连续转换还是一次转换。ADSCR的地址是:$003C,定义为:
数据位 D7 D6 D5 D4 D3 D2 D1 D0
定义 COCO AIEN ADCO ADCH4 ADCH3 ADCH2 ADCH1 ADCH0
复位 0 0 0 1 1 1 1 1
D7—COCO:转换完成(Conversions Complete)。当D6(AIEN)=0时,即转换结束不产生中断,COCO是只读位,COCO=1,转换完成;COCO=0,转换未完成。当再次向ADSCR写数据或读ADR寄存器数据内容时,COCO位自动清0。当AIEN=1时,即转换结束产生中断,COCO是可读写位,应该写COCO=0。
D6—AIEN:A/D转换中断允许标志位(ADC Interrupt Enable Bit)。AIEN =1,转换结束产生中断;当再次向ADSCR写数据或读ADR寄存器数据内容时,A/D转换中断请求信号自动撤消。AIEN =0,转换结束不产生中断,通过软件查询COCO得知转换结束。
D5—ADCO:连续转换控制位(ADC Continuous Conversion Bit)。ADCO=1,连续ADC转换,即连续进行采样并转换更新ADR;ADCO=0,一次ADC转换。
D4~D0:ADCH4~ADCH0,通道选择(ADC Channel Select Bits)。
ADCH4~ADCH0=00000-00111:AD0 引脚~AD7引脚
ADCH4~ADCH0=01000-11100:未用
ADCH4~ADCH0=11101:VREFH
ADCH4~ADCH0=11110:VREFL
ADCH4~ADCH0=11111:关闭ADC电源
2.A/D转换数据寄存器ADR (Analog-to-Digital Data Register)
ADR存放A/D转换的8位结果,每次A/D转换结束更新该寄存器。编程从该寄存器读取A/D转换结果。该寄存器地址为:$003D,为只读寄存器,复位时为$00。
3.A/D转换输入时钟寄存器ADCLK (Analog-to-Digital Input Clock Register)
该寄存器决定A/D转换的时钟频率来源、分频系数值,芯片内的A/D转换器要求ADC时钟频率为1MHz左右。ADCLK 的地址是:$003E,定义为:
数据位 D7 D6 D5 D4 D3 D2 D1 D0
定义 ADIV2 ADIV1 ADIV0 ADICLK 未定义 未定义 未定义 未定义
复位 0 0 0 0 0 0 0 0
D7~D5:ADIV2~ADIV0,ADC时钟分频系数选择位(ADC Clock Prescaler Bits)。设ADC时钟输入时钟源频率为f入,由ADIV2~ADIV0定义的分频系数为n,则ADC时钟频率=f入/n。n与ADIV2~ADIV0的关系是:
ADIV2~ADIV0=000 n=1
=001 n=2
=010 n=4
=011 n=8
=1xx n=16
D4:ADICLK,ADC输入时钟源选择位(ADC Input Clock Select Bit)。ADICLK =1,选择内部总线时钟;ADICLK =0,选择外部时钟(CGMXCLK)。
D3~D0:未用
ADC时钟要求: ADC时钟频率≈1MHz。具体编程时根据A/D转换的时钟频率来源确定分频系数值,确保芯片内的A/D转换器时钟频率为1MHz左右即可。
10.4.2 A/D转换模块的基本编程方法
A/D转换编程主要涉及输入时钟寄存器ADCLK($003E)、状态和控制寄存器ADSCR($003C)、数据寄存器ADR($003D)。
1.A/D转换初始化
在程序初始化时就应对A/D转换输入时钟寄存器ADCLK写入控制字节,决定时钟输入源是内部总线还是外部晶振,决定分频系数,使ADC时钟频率达1MHz,设使用内部总线时钟,且fBUS=2.4576MHz,则初始化程序为:
LDA #%00110000 //使用内部总线时钟,2分频
STA ADCLK //送入寄存器ADCLK
2.启动A/D转换
对A/D转换状态和控制寄存器ADSCR写入控制字节,选取要转换的通道、决定转换结束数据获取的方式、设置是连续转换还是一次转换,此时就开始了一路A/D转换,例如:
LDA #%00000000 //0通道,转换结束不产生中断,一次A/D转换
STA ADSCR //并启动0通道转换
3.获A/D转换结果
若是中断方式,在A/D中断程序中取得,若是查询方式,通过A/D状态和控制寄存器ADSCR的第7位(COCO位)取得,当COCO=1时,可从A/D数据寄存器ADR中取数。上述是查询方式,紧接上述程序:
BRCLR 7, ADSCR,. //COCO位=0则等待COCO位=1
LDA ADR //转换结束,转换结果送入A中


