OpenEdv-开源电子网

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

ADC转换遇到问题,求助大家

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-11-29
在线时间
3 小时
发表于 2018-12-9 09:44:51 | 显示全部楼层 |阅读模式
10金钱
我用的夏普的红外传感器测一下距离,,adc转化模块是按照原子哥教程写的,就是mian里面用了if判断输出距离,,,显示屏不现实距离


下面是mian函数
int main(void)
{
         float temp;
         u16 adcx;

          Adc_Init();
          SystemInit();
          OLED_Init();
    LCD_Print(15, 0, "GUYOUJIE",TYPE16X16,TYPE8X16);
          LCD_Print(15, 16, "DISTANCE",TYPE16X16,TYPE8X16);

        while(1)
        {
            adcx=Get_Adc_Average(ADC_Channel_1,10);
                   temp=(float)adcx*(3.3/4096);
                       
    if (temp>0.38&&temp<0.45)
                {
     LCD_Print(16, 32, "80cm",TYPE16X16,TYPE6X8);
                }
                else if (temp>0.45&&temp<0.65)
                {
     LCD_Print(16, 32, "50cm",TYPE16X16,TYPE6X8);
                }
                                else if (temp>0.65&&temp<0.80)
                {
     LCD_Print(16, 32, "40cm",TYPE16X16,TYPE6X8);
                }
                                else if (temp>0.80&&temp<1.05)
                {
     LCD_Print(16, 32, "30cm",TYPE16X16,TYPE6X8);
                }
                                else if (temp>1.05&&temp<1.25)
                {
     LCD_Print(16, 32, "25cm",TYPE16X16,TYPE6X8);
                }
                                else if (temp>1.25&&temp<1.50)
                {
     LCD_Print(16, 32, "20cm",TYPE16X16,TYPE6X8);
                }
                                else if (temp>1.50&&temp<1.95)
                {
     LCD_Print(16, 32, "15cm",TYPE16X16,TYPE6X8);
                }
                                else if (temp>1.95&&temp<2.50)
                {
     LCD_Print(16, 32, "10cm",TYPE16X16,TYPE6X8);
                }
                                else if (temp>2.50&&temp<2.95)
                {
     LCD_Print(16, 32, "8cm",TYPE16X16,TYPE6X8);
                }
                                else if (temp>2.95&&temp<3.05)
                {
     LCD_Print(16, 32, "7cm",TYPE16X16,TYPE6X8);
                }
                                else if (temp>3.05&&temp<3.15)
                {
     LCD_Print(16, 32, "5cm",TYPE16X16,TYPE6X8);
                }
                                                else if (temp>3.15&&temp<3.3)
                {
     LCD_Print(16, 32, "6cm",TYPE16X16,TYPE6X8);   
                }
        }
       
        }


求教大家为什么不可以显示啊 ,

最佳答案

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

已经解决了 那个是输入错误,原来adc1 对应的是PC1端口,
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-11-29
在线时间
3 小时
 楼主| 发表于 2018-12-9 09:44:52 | 显示全部楼层
nashui_sx 发表于 2018-12-9 12:13
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_ADC1, ENABLE );
         
        GP ...

已经解决了  那个是输入错误,原来adc1 对应的是PC1端口,
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-11-29
在线时间
3 小时
 楼主| 发表于 2018-12-9 09:46:12 | 显示全部楼层
本帖最后由 剪云者 于 2018-12-9 12:40 编辑

这是adc.c的   ,

#include "adc.h"
#include "delay.h"


void Adc_Init(void)
{
  ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );
         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        ADC_DeInit(ADC1);  

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;        
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        
        ADC_InitStructure.ADC_NbrOfChannel = 1;        
        ADC_Init(ADC1, &ADC_InitStructure);         

        ADC_Cmd(ADC1, ENABLE);
        
        ADC_ResetCalibration(ADC1);        
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //μè′y&#184;′&#206;&#187;D£×&#188;&#189;áê&#248;
        
        ADC_StartCalibration(ADC1);         //&#191;a&#198;&#244;ADD£×&#188;

        while(ADC_GetCalibrationStatus(ADC1));         

}


u16 Get_Adc(u8 ch)
{
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5 );                                             
  
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                        
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

        return ADC_GetConversionValue(ADC1);
}


u16 Get_Adc_Average(u8 ch,u8 times)
{
         u32 temp_val=0;
        u8 t;
        for(t=0;t<times;t++)
        {
                temp_val+=Get_Adc(ch);
                delay_ms(5);
        }
        return temp_val/times;//
}


回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-12-9 12:13:42 | 显示全部楼层
剪云者 发表于 2018-12-9 09:46
这是adc.c的   ,

#include "adc.h"

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_ADC1, ENABLE );
         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIOA时钟
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 13:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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