在线时间66 小时
UID3239593
注册时间2016-4-20
NXP金币0
TA的每日心情 | 开心 2016-10-25 10:29 |
---|
签到天数: 1 天 连续签到: 1 天 [LV.1]初来乍到
中级会员
 
- 积分
- 272
- 最后登录
- 2019-6-10
|
大家下午好!
我的问题就是题目所示。事情经过大概是这样的:最先我是先用自己根据SDK2.0给的ADC16例程,自己简写了一个测量外部引脚电压程序,然后测量的结果如题目所示。我找原因找了一段时间没找到原因,就用官方例程测量一下,想查看一下寄存器里的值,发现跟自己写小程序测量结果的一样。实际电压大概在3.0V左右的时候,ADC测量值就达到4095了。
走过路过的版友,有时间的帮忙看看是啥问题 。
程序如下:
void ADC0_POTINIT(void)
{
//打开端口A时钟
CLOCK_EnableClock(kCLOCK_PortA);
//选择PA8引脚,设置为模拟状态(PA8---ADC0_SE3----AD3)
PORT_SetPinMux(PORTA, 8U, kPORT_PinDisabledOrAnalog);
}
void ADC0_Init(void)
{
uint32_t tmp32;
//打开ADC0时钟
SIM->SCGC6 |= 1<<27;
//选择时钟来源(这里选择了异步时钟)和采样精度(单端12位转换)
tmp32 = ADC_CFG1_ADICLK(0x01) | ADC_CFG1_MODE(0x01);
//选择输入时钟分频系数(8分频)
tmp32 |= ADC_CFG1_ADIV(0x01);
//将配置写进相应寄存器
ADC0->CFG1 = tmp32;
//先清异步时钟输出使能位 高速配置位 长采样时间选择位
tmp32 = ADC0->CFG2 & ~(ADC_CFG2_ADACKEN_MASK | ADC_CFG2_ADHSC_MASK | ADC_CFG2_ADLSTS_MASK);
//使能异步时钟输出位
tmp32 |= ADC_CFG2_ADACKEN_MASK;
ADC0->CFG2 = tmp32;
//先清电压参考选择位
tmp32 = ADC0->SC2 & ~(ADC_SC2_REFSEL_MASK);
//选择Vrefh Vrefl 两个引脚作为 AD 转换的参考电压;
tmp32 |= ADC_SC2_REFSEL(0);
ADC0->SC2 = tmp32;
//是否选择“持续转换”(不选择)
ADC0->SC3 &= ~ADC_SC3_ADCO_MASK;
//软件触发
ADC0->SC2 &= ~ADC_SC2_ADTRG_MASK;
}
//设置ADC0通道
void ADC0_SetChannelConfig(void)
{
uint32_t sc1 = ADC_SC1_ADCH(0x03);//这里选择了PA8引脚
ADC0->SC1[0] = sc1;//寄存器通道组0用于组A寄存器,通道组1用于组B寄存器。
}
//ADC0的数据处理
void ADC_Value_Handle(void)
{
short ADC_Vlaue,Voltage;
//等待转换完成
while (0U == (kADC16_ChannelConversionDoneFlag &
ADC16_GetChannelStatusFlags(ADC0, 0)))
{
}
//读取数据
ADC_Vlaue = ADC0->R[0];
//value[0]=(uint8_t)ADC_Vlaue;
//value[1]=(uint8_t)(ADC_Vlaue>>8);
//ADC_Vlaue++;
//PRINTF("ADC Value: %d\r\n", ADC_Vlaue);
//计算为正常的电压值。
//Voltage = (ADC_Vlaue*3.3)/4095; //4095---12位的精度 255--8位的精度
// return Voltage;
}
main()
{
set_fee();
ADC0_Init();
while(1)
{
ADC0_SetChannelConfig();
ADC_Value_Handle();
//延时1S
lptmr_LPO_clock_counter(1000);
}
}
最佳答案
足球爱好者 发表于 2016-10-28 17:19
刚刚测了一下,还真是2.95V!谢谢版主!!
不客气,ADC转换的准确性,参考基准电压是关键。
|
|