首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

请教采集短时间脉冲的ad转换结果的问题

请教采集短时间脉冲的ad转换结果的问题

为了减少能量的消耗,我想发一个很短的脉冲,然后用ad采集这个脉冲所带来的电压的变化不知道用9s12dg128b如何实现?
我试图将ATDCTRL2的ETRIGL和EETRIGP设为1,但是没成功,是不是我的程序有问题呀?
原程序:
#include /* common defines and macros */
#include /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

/*$OSEKDecl$*//*$XGATEDecl$*/
word AD_wData[8]; //全局变量存放 AD0,AD1,AD2的结果
void main(void) {
dword i;
AD_Init(); //AD 初始化
initsci();
DDRB = 0xFF;
PORTB = 0x00;
AD_wData[0] = 0; //全局变量初始化
AD_wData[1] = 0;
AD_wData[2] = 0;
AD_wData[3] = 0;
AD_wData[4] = 0;
AD_wData[5] = 0;
AD_wData[6] = 0;
AD_wData[7] = 0;
//EnableInterrupts;
for(;;)
{
//if(ATD0CTL2_ASCIE == 0) //采用查询方式
//{
while(!ATD0STAT1_CCF0); //等待通道0转换结束
AD_wData[0] = ATD0DR0; //读通道0的转换结果
while(!ATD0STAT1_CCF1); //等待通道1转换结束
AD_wData[1] = ATD0DR1; //读通道1的转换结果
while(!ATD0STAT1_CCF2); //等待通道2转换结束
AD_wData[2] = ATD0DR2; //读通道2的转换结果
while(!ATD0STAT1_CCF3); //等待通道3转换结束
AD_wData[3] = ATD0DR3;
while(!ATD0STAT1_CCF4); //等待通道4转换结束
AD_wData[4] = ATD0DR4;
while(!ATD0STAT1_CCF5); //等待通道5转换结束
AD_wData[5] = ATD0DR5;
while(!ATD0STAT1_CCF6); //等待通道6转换结束
AD_wData[6] = ATD0DR6;
while(!ATD0STAT1_CCF7); //等待通道7转换结束
AD_wData[7] = ATD0DR7;
send_sci(AD_wData);
// }
//PORTB = (byte)AD_wData[0]; //用PORT B来显示AD0的值
//for(i=0;i<0xFFFFF;i++); //delay
//PORTB = (byte)AD_wData[1]; //用PORT B来显示AD1的值
//for(i=0;i<0xFFFFF;i++); //delay
//PORTB = (byte)AD_wData[2]; //用PORT B来显示AD1的值
//for(i=0;i<0xFFFFF;i++); //delay
}
}
AD_Init(void) //AD初始化
{
//控制寄存器2: 上电,标志位快速清零,开中断
ATD0CTL2 = (ATD0CTL2_ADPU_MASK|ATD0CTL2_AFFC_MASK|ATD0CTL2_ETRIGP_MASK|ATD0CTL2_ETRIGE_MASK|ATD0CTL2_ASCIE_MASK);
//控制寄存器3:转换序列长度为3,FIFO模式
ATD0CTL3 = (ATD0CTL3_S8C_MASK|ATD0CTL3_FIFO_MASK);
//控制寄存器4:
ATD0CTL4 = (ATD0CTL4_SRES8_MASK|ATD0CTL4_PRS1_MASK|ATD0CTL4_PRS0_MASK);
//控制寄存器5:
ATD0CTL5 = (ATD0CTL5_DJM_MASK|ATD0CTL5_MULT_MASK);

ATD0DIEN=0x00; // 禁止数字输入缓冲
}


initsci(void){
SCI0BDL=0x34;
SCI0BDH=0x00;
SCI0CR1=0x00;

}


send_sci(word *A)
{
int i;
SCI0CR2=0x08;
for(i=0;i<8;i++)
{
SCI0DRL=A;
while(SCI0SR1!=0X80)
{;}
}
}

//#pragma CODE_SEG NON_BANKED //中断服务程序
//void interrupt 22 Int_AD0(void)
//{
// AD_wData[0] = ATD0DR0; //将结果寄存器中的值存放到数组中
// AD_wData[1] = ATD0DR1; //将结果寄存器中的值存放到数组中
// AD_wData[2] = ATD0DR2; //将结果寄存器中的值存放到数组中
// AD_wData[3] = ATD0DR3;
// AD_wData[4] = ATD0DR4;
// AD_wData[5] = ATD0DR5;
// AD_wData[6] = ATD0DR6;
//AD_wData[7] = ATD0DR7;
// send_sci(AD_wData);
//}
#include /* common defines and macros */
#include /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

/*$OSEKDecl$*//*$XGATEDecl$*/
word AD_wData[8]; //全局变量存放 AD0,AD1,AD2的结果
void main(void) {
dword i;
AD_Init(); //AD 初始化
initsci();
DDRB = 0xFF;
PORTB = 0x00;
AD_wData[0] = 0; //全局变量初始化
AD_wData[1] = 0;
AD_wData[2] = 0;
AD_wData[3] = 0;
AD_wData[4] = 0;
AD_wData[5] = 0;
AD_wData[6] = 0;
AD_wData[7] = 0;
//EnableInterrupts;
for(;;)
{
//if(ATD0CTL2_ASCIE == 0) //采用查询方式
//{
while(!ATD0STAT1_CCF0); //等待通道0转换结束
AD_wData[0] = ATD0DR0; //读通道0的转换结果
while(!ATD0STAT1_CCF1); //等待通道1转换结束
AD_wData[1] = ATD0DR1; //读通道1的转换结果
while(!ATD0STAT1_CCF2); //等待通道2转换结束
AD_wData[2] = ATD0DR2; //读通道2的转换结果
while(!ATD0STAT1_CCF3); //等待通道3转换结束
AD_wData[3] = ATD0DR3;
while(!ATD0STAT1_CCF4); //等待通道4转换结束
AD_wData[4] = ATD0DR4;
while(!ATD0STAT1_CCF5); //等待通道5转换结束
AD_wData[5] = ATD0DR5;
while(!ATD0STAT1_CCF6); //等待通道6转换结束
AD_wData[6] = ATD0DR6;
while(!ATD0STAT1_CCF7); //等待通道7转换结束
AD_wData[7] = ATD0DR7;
send_sci(AD_wData);
// }
//PORTB = (byte)AD_wData[0]; //用PORT B来显示AD0的值
//for(i=0;i<0xFFFFF;i++); //delay
//PORTB = (byte)AD_wData[1]; //用PORT B来显示AD1的值
//for(i=0;i<0xFFFFF;i++); //delay
//PORTB = (byte)AD_wData[2]; //用PORT B来显示AD1的值
//for(i=0;i<0xFFFFF;i++); //delay
}
}
AD_Init(void) //AD初始化
{
//控制寄存器2: 上电,标志位快速清零,开中断
ATD0CTL2 = (ATD0CTL2_ADPU_MASK|ATD0CTL2_AFFC_MASK|ATD0CTL2_ETRIGP_MASK|ATD0CTL2_ETRIGE_MASK|ATD0CTL2_ASCIE_MASK);
//控制寄存器3:转换序列长度为3,FIFO模式
ATD0CTL3 = (ATD0CTL3_S8C_MASK|ATD0CTL3_FIFO_MASK);
//控制寄存器4:
ATD0CTL4 = (ATD0CTL4_SRES8_MASK|ATD0CTL4_PRS1_MASK|ATD0CTL4_PRS0_MASK);
//控制寄存器5:
ATD0CTL5 = (ATD0CTL5_DJM_MASK|ATD0CTL5_MULT_MASK);

ATD0DIEN=0x00; // 禁止数字输入缓冲
}


initsci(void){
SCI0BDL=0x34;
SCI0BDH=0x00;
SCI0CR1=0x00;

}


send_sci(word *A)
{
int i;
SCI0CR2=0x08;
for(i=0;i<8;i++)
{
SCI0DRL=A;
while(SCI0SR1!=0X80)
{;}
}
}

//#pragma CODE_SEG NON_BANKED //中断服务程序
//void interrupt 22 Int_AD0(void)
//{
// AD_wData[0] = ATD0DR0; //将结果寄存器中的值存放到数组中
// AD_wData[1] = ATD0DR1; //将结果寄存器中的值存放到数组中
// AD_wData[2] = ATD0DR2; //将结果寄存器中的值存放到数组中
// AD_wData[3] = ATD0DR3;
// AD_wData[4] = ATD0DR4;
// AD_wData[5] = ATD0DR5;
// AD_wData[6] = ATD0DR6;
//AD_wData[7] = ATD0DR7;
// send_sci(AD_wData);
//}
//#pragma CODE_SEG DEFAULT_ROM
你现在的问题是什么,是不能将ATDCTRL2的ETRIGL和EETRIGP设为1吗?你可以试试先将ETRIGE位清零,再将ATDCTRL2的ETRIGL和EETRIGP设为1,然后再将ETRIGE位置1。
海纳百川  有容乃大
返回列表