12位精度AD转换

MC9S12XS128——AD模块8通道轮流转换,转换精度12位。在中断里读出电位器分压所转化的数值。
分类: MC9S12XS128 2011-11-10 21:31 745人阅读 评论(0) 收藏 举报
macrossysteminclude
[cpp] view plaincopy
#include /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */

uint AD_result[8];

//-- 时钟初始化程序 --//
void SetBusCLK_40M(void)
{
CLKSEL = 0X00; //disengage PLL to system
PLLCTL_PLLON = 1; //turn on PLL
SYNR = 0xc0 | 0x04;
REFDV = 0x80 | 0x01;
POSTDIV = 0x00; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=2*16*(1+4)/(1+1)=80MHz;
_asm(nop); //BUS CLOCK=40M
_asm(nop);
while(!(CRGFLG_LOCK == 1)); //when pll is steady ,then use it;
CLKSEL_PLLSEL = 1; //engage PLL to system;
}

//-- ATD初始化程序 --//
void ATD_Init(){
ATD0DIEN=0x0000; //禁止数字输入缓冲到ANx引脚,这时该引脚作为模拟量输入口使用?

ATD0CTL1=0x40; //0100 0000 -0 0000:选择 AD 通道为外部触发 ,10:12位精度 , 0:采样前不放电
ATD0CTL2=0x42; //0100 0000 -1 标志位自动清零,禁止外部触发 , 0禁止中断
//ASCIE=1:允许ATD转换序列完成产生中断请求
ATD0CTL3=0xC0; //1100 0000 -DJM=1 右对齐无符号 , 每次转换8个序列 , 非FIFO模式, Freeze 模式下继续转换?
ATD0CTL4=0x03; //0000 0011 -采样时间为 4 个 AD 时钟周期 ,PRS=1,ATDClock=BUSClock/(2*(PRS+1))=5MHz
ATD0CTL5=0x30; //0011 0000 -0:特殊通道禁止 , 1:连续转换序列模式,1:多通道转换,0000:起始通道为0?
}

//#define VectorNumber_Vatd0 22U
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 22 ATD_ISR(void){
AD_result[0] = ATD0DR0;
AD_result[1] = ATD0DR1;
AD_result[2] = ATD0DR2;
AD_result[3] = ATD0DR3;
AD_result[4] = ATD0DR4;
AD_result[5] = ATD0DR5;
AD_result[6] = ATD0DR6;
AD_result[7] = ATD0DR7;

}

void main(void) {
/* put your own code here */
SetBusCLK_40M();
ATD_Init();

EnableInterrupts;
for(;;) {
_FEED_COP(); /* feeds the dog */
} /* loop forever */ \\\



【转】MC9S12XS128之时间模块TIM(3)脉冲累加器 XS128中的脉冲累加器和DG128的很不一样。相对DG128来说,XS128的脉冲累加器大大简化了,其中只有三个寄存器需要设置:PACTL、PAFLG、PACNT。

16位脉冲累加器PACT与IOC7共用一个引脚。顾名思义,脉冲累加器就是对有效边沿(上升沿或下降沿)进行计数,然后把计数的值保存在寄存器PACNT中。寄存器PACTL是16位脉冲累加器的核心,几乎所有的设置都是在这个寄存器中。

接下来解剖一下这个核心寄存

器PACTL:




PAEN:脉冲累加器允许位,置1,则工作。置0,则禁止。PAEN与TEN无关,定时器TEN禁止时,脉冲累加器仍可以工作。

PAMOD:工作方式选择位。置1,为门控时间累加器方式。置0,为事件计数器方式。

门控时间累加器方式:输入引脚上的有效电平会触发脉冲累加器对64分频后的时钟进行计数。

事件计数器方式:脉冲累加器对引脚上的每个有效边沿计数。引脚上每产生一个有效边沿,脉冲累加器计数器的值就会加1。

PEDGE:边沿跳变控制位。它的功能和脉冲累加器的工作方式有关。如下表:




(0 0):事件计数器方式,下降沿有效

(0 1):事件计数器方式,上升沿有效

(1 0):门控时间累加器方式,IOC7引脚上的高电平使64分频后的总线时钟输入到脉冲累加器中。

(1 1):门控时间累加器方式,IOC7引脚上的低电平使64分频后的总线时钟输入到脉冲累加器中。

CLK0~CLK1:时钟选择位。其功能如下表:




(0 0):使用TIM中分频后的定时器时钟作为计数时钟

(0 1):选PACLK作为计数时钟

(1 0):选PACLK/256作为计数时钟

(2 1):选PACLK/65536作为计数时钟

其中PACLK是对总线时钟进行64分频后的时钟。

PAVOI:脉冲累加器溢出中断允许位。置1,则允许中断产生。置0,则禁止中断。

PAI:脉冲累加器输入中断允许位。置1,则允许中断产生。置0,则禁止中断。



标志寄存器PAFLG:





PAVOF:当脉冲累加器溢出时,此位置1。如果有PAVOI=1时,则产生中断。向该位写1,可以清除标志位。

PAIF:当在IOC7引脚上检测到选定的边沿跳变,此位置1。在事件计数方式下,事件沿跳变会使该位置位。在门控时间累加器方式下,IOC7引脚上门控信号的最后一个下降沿使该位置位。对其写1,可以清除标志位。



计数寄存器PACNT:







此寄存器保存着计数的值。



#include /* common defines and macros */

#include "derivative.h" /* derivative-specific definitions */



void main(void)

{

DDRB=0XFF;

//DDRT=0X00;

PACTL=0X51; //设置脉冲累加器,打开输入中断允许位

EnableInterrupts; //这样,只设置一个寄存器,脉冲累加器就设置完了。

for(;;)

{; }

}



#pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 18 MDC(void) //脉冲累加器的输入中断号为18

{

DisableInterrupts;

PORTB=~PORTB;

PAFLG_PAIF=1; //清除标志位

EnableInterrupts;

}

/* please make sure that you never leave main */
}

相关主题
相关文档
最新文档