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

2019-07-21 07:03发布

我用的夏普的红外传感器测一下距离,,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);   
                }
        }
       
        }


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

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
剪云者
1楼-- · 2019-07-21 09:45
nashui_sx 发表于 2018-12-9 12:13
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_ADC1, ENABLE );
         
        GP ...

已经解决了  那个是输入错误,原来adc1 对应的是PC1端口,
剪云者
2楼-- · 2019-07-21 13:37
本帖最后由 剪云者 于 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;//
}


nashui_sx
3楼-- · 2019-07-21 18:32
剪云者 发表于 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时钟

一周热门 更多>