|
发表于 2012-6-11 11:35:53
|
显示全部楼层
本帖最后由 szy494468597 于 2012-6-11 11:38 编辑
楼主,有没有 C8051F920 的AD采集程序? AD采集的数值,和万用表量出来的差距很大,而且数值基本上上不会变化
我用的是 Burst 模式采集(具备自动平均值的功能),采样精度是12位,定时器2 的下降沿 被配置为 burst AD 转化的条件
//-----------------------------------------------------------------------------
// ADC0_Init
//-----------------------------------------------------------------------------
// Configures ADC0 to make single-ended analog measurements on pin P1.6
// AD采用 Burst 模式采集,具备自动平均值的功能,采样精度是12位
// 定时器2 的下降沿 被配置为 burst AD 转化的条件.
//-----------------------------------------------------------------------------
void ADC0_Init (void)
{
//ADC0MX = 0x0E; // Select P1.6=Temp as the ADC input pin ****** AD 只能选择一个引脚?***
ADC0MX = 0x0F; // Select P1.7=Temp as the ADC input pin
ADC0CN = 0x42; // ADC0 无效, 开启 Burst 模式, ********* ?ADC0无效? ******
// 在 TMR2 下降沿的时候开启
ADC0AC = 0x13; // 010:右对齐。右移2位。
// 011:执行和累加16次转换。
REF0CN = 0x18; // REF0CN 选择地基准 和 电压基准
// REFSL:11 电压基准选为内部1.65V高速电压基准
ADC0CF = ((SYSCLK/8300000))<<3; //*********Set SAR clock to 8.3MHz********
ADC0CF |= 0x00; // Select Gain of 0.5,这样值可以翻倍,因为参考电压是1.65v
EIE1 |= 0x08; // Enable ADC0 conversion complete int.
}
//-----------------------------------------------------------------------------
// ADC0_ISR
//-----------------------------------------------------------------------------
// This ISR averages 2048 samples then prints the result to the terminal. The
// ISR is called after each ADC conversion which is triggered by Timer2.
//-----------------------------------------------------------------------------
INTERRUPT(ADC_ISR, INTERRUPT_ADC0_EOC)
{
uint i;
unsigned long result;
unsigned long mV; // measured voltage in mV
//static unsigned char sample_count = 0;
AD0INT = 0; // clear ADC0 conv. complete flag
result = ADC0; // copy ADC0 into result
// The 12-bit ADC value represents the voltage applied
// to P1.4 according to the following equation:
//
// Vref (mV)
// measurement (mV) = --------------- * result (bits)
// ((2^10)-1)*2^2 (bits)
mV = result * 3300 / 4092; // 0xC86 (3206) --> 1.56V
for(i = 0;i <501;i++) // 查表,i 为温度值
{
if(mV >= VT_Table)
{
temperature = i;
break;
}
}
LED = ~LED;
}
万用表测出来 1.59V的,但程序仿真 结果 mV = 0XC67 即 3207 ; 当温度值变化时,万用表测是有变化的,但AD值基本不变 很奇怪
大家帮忙看一下程序有没有问题吧 ,谢谢
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|