OpenEdv-开源电子网

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

ADC采样到的数据为0,这是我为什么呀

[复制链接]

29

主题

492

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2016-4-7
在线时间
123 小时
发表于 2016-6-14 16:27:48 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 xujian468 于 2016-6-14 16:56 编辑

板子我自己做的,使用的是STM32F103C8T6的片子,VDDA接3.3V,VSSA接GND,采集的数据是个直流的1.5V电压,为什么采集到的数据却是0,有那方面的可能引起这个原因,采集口为PA1,程序

33333.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11553
金钱
11553
注册时间
2014-4-1
在线时间
1317 小时
发表于 2016-6-14 16:34:32 | 显示全部楼层

这个常见,
基本都是软件有问题。


回复

使用道具 举报

11

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2016-3-1
在线时间
55 小时
发表于 2016-6-14 16:53:47 | 显示全部楼层
怎么不把程序贴出来
回复

使用道具 举报

1

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2016-6-10
在线时间
19 小时
发表于 2016-6-14 16:56:37 | 显示全部楼层
八成是因为时钟没开或者就没启动转换
回复

使用道具 举报

29

主题

492

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2016-4-7
在线时间
123 小时
 楼主| 发表于 2016-6-14 16:57:19 | 显示全部楼层
本帖最后由 xujian468 于 2016-6-14 18:16 编辑

////////////////////////////////////////////////////////////        
int main(void)
{         
        u8 t=0;
  u16 adcx;
        float temp;

        delay_init();                     //延时函数初始化         
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级        
        uart_init(115200);                 //串口初始化为 115200
        GP2Y_Init();        
        BEEP_Init();
        BEEP_ON();
        //wendu_head();
        while(1)
        {         

                //wendu_get_send();//温度采集,发送
    //for(t=0;t<5;t++)delay_ms(1000);


adcx=Get_Adc_Average(ADC_Channel_1,10);
                                temp=(float)adcx*(3300/4096);
                adcx=temp*1000;
                temp=(float)adcx*(3300/4096);
                adcx=temp;
                temp-=adcx;
                temp*=1000;
               wendu[0]=temp/1000;
        wendu[1]=temp%1000/100;  
            wendu[2]=temp%100/10;   
        wendu[3]=temp%10;        
         
   for(t=0;t<4;t++)
         {
                        USART_SendData(USART1, wendu[t]);//向串口1发送数据
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待数据发送完毕
         }
   for(t=0;t<5;t++)delay_ms(1000);

        }
}

回复

使用道具 举报

29

主题

492

帖子

0

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2016-4-7
在线时间
123 小时
 楼主| 发表于 2016-6-14 16:58:49 | 显示全部楼层

void GP2Y_LED_Init(void)
{
   GPIO_InitTypeDef  GPIO_InitStructure;
       
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//ê1&#196;üGPIOB&#182;&#203;&#191;úê±&#214;ó

   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                    //GP2Y_OUT-->PB.1 &#182;&#203;&#191;ú&#197;&#228;&#214;&#195;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                 //í&#198;íìê&#228;3&#246;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //&#203;ù&#182;è&#206;a50MHz
   GPIO_Init(GPIOB, &GPIO_InitStructure);                      //&#184;ù&#190;Y2&#206;êy3&#245;ê&#188;&#187;ˉGPIOB.1

   GPIO_SetBits(GPIOB,GPIO_Pin_1);                      //ê&#228;3&#246;1
}


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

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //ê1&#196;üADC1í¨μàê±&#214;ó


        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //éè&#214;&#195;ADC·&#214;&#198;μòò×ó6 72M/6=12,ADC×&#238;′óê±&#188;&#228;2&#187;&#196;ü3&#172;1y14M

        //PA1 ×÷&#206;a&#196;£&#196;aí¨μàê&#228;è&#235;òy&#189;&#197;                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //&#196;£&#196;aê&#228;è&#235;òy&#189;&#197;
        GPIO_Init(GPIOA, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  //&#184;′&#206;&#187;ADC1

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC1¤×÷&#196;£ê&#189;:ADC1oíADC21¤×÷&#212;ú&#182;àá¢&#196;£ê&#189;
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //&#196;£êy×a&#187;&#187;1¤×÷&#212;úμ¥í¨μà&#196;£ê&#189;
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //&#196;£êy×a&#187;&#187;1¤×÷&#212;úμ¥′&#206;×a&#187;&#187;&#196;£ê&#189;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //×a&#187;&#187;óéèí&#188;t&#182;&#248;2&#187;ê&#199;ía2&#191;′¥·¢&#198;&#244;&#182;ˉ
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADCêy&#190;Yóò&#182;&#212;&#198;&#235;
        ADC_InitStructure.ADC_NbrOfChannel = 1;        //&#203;3Dò&#189;&#248;DD1&#230;&#212;ò×a&#187;&#187;μ&#196;ADCí¨μàμ&#196;êy&#196;&#191;
        ADC_Init(ADC1, &ADC_InitStructure);        //&#184;ù&#190;YADC_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèADCxμ&#196;&#188;&#196;′&#230;&#198;÷   

  
        ADC_Cmd(ADC1, ENABLE);        //ê1&#196;ü&#214;&#184;&#182;¨μ&#196;ADC1
       
        ADC_ResetCalibration(ADC1);        //ê1&#196;ü&#184;′&#206;&#187;D£×&#188;  
         
        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));         //μè′yD£×&#188;&#189;áê&#248;

//        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //ê1&#196;ü&#214;&#184;&#182;¨μ&#196;ADC1μ&#196;èí&#188;t×a&#187;&#187;&#198;&#244;&#182;ˉ1|&#196;ü

}                                  


void GP2Y_Init(void)
{
        GP2Y_LED_Init();
        GP2Y_Adc_Init();
}



u16 Get_Adc(u8 ch)   
{
          //éè&#214;&#195;&#214;&#184;&#182;¨ADCμ&#196;1&#230;&#212;ò×éí¨μà£&#172;ò&#187;&#184;&#246;DòáD£&#172;2é&#209;ùê±&#188;&#228;
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADCí¨μà,2é&#209;ùê±&#188;&#228;&#206;a239.5&#214;ü&#198;ú                                      
  
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //ê1&#196;ü&#214;&#184;&#182;¨μ&#196;ADC1μ&#196;èí&#188;t×a&#187;&#187;&#198;&#244;&#182;ˉ1|&#196;ü       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//μè′y×a&#187;&#187;&#189;áê&#248;

        return ADC_GetConversionValue(ADC1);        //·μ&#187;&#216;×&#238;&#189;üò&#187;′&#206;ADC11&#230;&#212;ò×éμ&#196;×a&#187;&#187;&#189;á1&#251;
}


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;
}          
回复

使用道具 举报

11

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
133
金钱
133
注册时间
2016-3-1
在线时间
55 小时
发表于 2016-6-14 17:17:39 | 显示全部楼层
你把adcx的值打印出来看看
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 04:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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