OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3506|回复: 6

ADC及内部温度传感器问题

[复制链接]

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
发表于 2016-8-8 17:00:25 | 显示全部楼层 |阅读模式
3金钱
原子哥在ADC实验中将ADC和内部温度传感器分开为2个工程建立的,我现在做到一起,初始化中开启了内部温度传感器通道。在主函数中获取ADC1通道1 PA0的ADC结果是正常的,但是随后获取温度传感器的数据就是偏大的(温度值偏小),前面不获取通道1的ADC,直接获取温度传感器的数据就可以是正确的,这是怎么回事呢?

最佳答案

查看完整内容[请看2#楼]

找到原因了,2次转换公用了adcx这个变量,如果把温度传感的adcx改了就对了,我很是不解原因,明明已经对adcx变量重新赋值了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
 楼主| 发表于 2016-8-8 17:00:26 | 显示全部楼层

找到原因了,2次转换公用了adcx这个变量,如果把温度传感的adcx改了就对了,我很是不解原因,明明已经对adcx变量重新赋值了。
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
 楼主| 发表于 2016-8-9 10:06:08 | 显示全部楼层
没人知道吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-9 23:33:04 | 显示全部楼层
看看是不是配置互相干扰了。
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
 楼主| 发表于 2016-8-10 10:40:55 | 显示全部楼层
本帖最后由 bumbdong 于 2016-8-10 10:43 编辑
正点原子 发表于 2016-8-9 23:33
看看是不是配置互相干扰了。

正常温度值应该再30度左右,可是我如果开启了2个通道的转换,温度值就只有24度左右
ADC初始化:
void Adc_Init(void)
{
        ADC_InitTypeDef ADC_InitStructre;
        GPIO_InitTypeDef GPIO_InitStructre;
        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);        //使能PA、ADC1时钟
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);                                        //ADC时钟分频因子6,72M/6=12M,ADC最大时钟频率不能超过14M
        
        GPIO_InitStructre.GPIO_Pin=GPIO_Pin_0;                                //PA0设置为ADC输入
        GPIO_InitStructre.GPIO_Mode=GPIO_Mode_IN_FLOATING;        //浮空输入
        GPIO_Init(GPIOA,&GPIO_InitStructre);                                //写入PA0配置
        
        ADC_DeInit(ADC1);                                                                        //初始化ADC1,讲ADC1所有参数重置缺省状态
        ADC_InitStructre.ADC_Mode=ADC_Mode_Independent;                //ADC工作模式:ADC1、ADC2工作在独立模式
        ADC_InitStructre.ADC_ScanConvMode=DISABLE;                        //模数转换工作在但通道模式
        ADC_InitStructre.ADC_ContinuousConvMode=DISABLE;        //模数转换工作在单次模式转换模式
        ADC_InitStructre.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动
        ADC_InitStructre.ADC_NbrOfChannel=1;                                //顺序进行规则转换的ADC通道数目
        ADC_InitStructre.ADC_DataAlign=ADC_DataAlign_Right;        //ADC数据右对齐
        ADC_Init(ADC1,&ADC_InitStructre);                                        //写入ADC配置参数
        
        ADC_TempSensorVrefintCmd(ENABLE);                                        //开启内部温度传感器通道
        
        ADC_Cmd(ADC1,ENABLE);                                                                //使能ADC1
        ADC_ResetCalibration(ADC1);                                                        //使能复位校准
        while(ADC_GetResetCalibrationStatus(ADC1));                        //等待复位校准结束
        ADC_StartCalibration(ADC1);                                                        //ADC1开始校准
        while(ADC_GetCalibrationStatus(ADC1));                                //等待ADC1校准结束
}

主函数:
int main(void)
{
        u16 adcx;
        float temp,tep;
        delay_init();
        LED_Init();
        uart_init(9600);                //放在LCD初始化之前(lcd初始化使用到printf),否则程序将出现异常
        LCD_Init();
        
        Adc_Init();
        POINT_COLOR=RED;
        LCD_ShowString(30,60,300,24,24,"Mini STM32 -_-||!");
        LCD_ShowString(30,90,300,24,24,"ADC Test!!");
        LCD_ShowString(30,120,300,16,16,"ADC_CH1 Value is:");
        LCD_ShowString(30,140,300,16,16,"ADC_CH1 Voltage is:0.000V");
        LCD_ShowString(30,170,300,16,16,"ADC_TEP Value is:");
        LCD_ShowString(30,190,300,16,16,"ADC_TEP Voltage is:0.000V");
        LCD_ShowString(30,210,300,16,16,"IC Temperate is:00.00C");
        POINT_COLOR=BLUE;
        LCD_ShowString(182,140,200,16,16,"0.000");
        LCD_ShowString(182,190,200,16,16,"0.000");
        LCD_ShowString(158,210,200,16,16,"00.00");
        while(1)
        {
                adcx=Get_Adc_Average(ADC_Channel_1,10);
                LCD_ShowxNum(166,120,adcx,4,16,0);
                temp=(float)adcx*(3.3/4096);
                adcx=temp;
                LCD_ShowxNum(182,140,adcx,1,16,0);
                temp=(temp-adcx)*1000;
                LCD_ShowxNum(198,140,temp,3,16,0x80);
        
                adcx=Get_Adc_Average(ADC_Channel_TempSensor,10);
                LCD_ShowxNum(166,170,adcx,4,16,0);
                temp=(float)adcx*(3.3/4096);
                adcx=temp;
                tep=temp;
                LCD_ShowxNum(182,190,adcx,1,16,0);
                temp=(temp-adcx)*1000;
                LCD_ShowxNum(198,190,temp,3,16,0x80);
                tep=((1.43-tep)/0.0043)+25;
                LCD_ShowxNum(158,210,(u8)tep,2,16,0);
                tep-=(u8)tep;
                tep*=100;
                LCD_ShowxNum(182,210,tep,2,16,0x80);
                LED0=!LED0;
                delay_ms(500);
        }
}

麻烦原子哥给看一下 这个哪里出的问题
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-10 20:40:49 | 显示全部楼层
bumbdong 发表于 2016-8-10 10:40
正常温度值应该再30度左右,可是我如果开启了2个通道的转换,温度值就只有24度左右
ADC初始化:
void A ...

代码看起来OK哦
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2015-11-30
在线时间
39 小时
 楼主| 发表于 2016-8-11 09:56:13 | 显示全部楼层

代码我觉得也是没问题啊,可结果就是不对,那是应该怎么解决啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 22:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表