ADC 电压检测

2019-08-15 16:02发布

void adc_measure(u16 ch)
{
        u16 adcx;
        float temp;
        adcx=Get_Adc_Average(ch,100);
      usb_printf(" %d ",adcx);
        temp=(float)adcx*(3.3/4096);
      usb_printf(" %f ",temp);
}

int main(void)
{     
        u16 t;
//      u16 delay;
        u16 data;
        u16 len;   
        u16 times=0;   
        u8 usbstatus=0;   
        delay_init();             //ÑÓʱº¯Êý³õʼ»¯      
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);     //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
        uart_init(115200);         //´®¿Ú³õʼ»¯Îª115200
        Adc_Init();                  //ADC³õʼ»¯
      Relay_Init();        //relay³õʼ»¯
        LED_Init();                  //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú   
        delay_ms(1800);
        USB_Port_Set(0);     //USBÏȶϿª
        delay_ms(700);
        USB_Port_Set(1);    //USBÔÙ´ÎÁ¬½Ó
        Set_USBClock();   
        USB_Interrupts_Config();   
        USB_Init();        
    while(1)
    {
        if(usbstatus!=bDeviceState)//USBÁ¬½Ó״̬·¢ÉúÁ˸ıä.
        {
            usbstatus=bDeviceState;//¼Ç¼ÐµÄ״̬
            if(usbstatus==CONFIGURED)
            {
                usb_printf("usb_connected ");
            }else
            {
                usb_printf("usb_disconnected ");
            }
        }
        if(USB_USART_RX_STA&0x8000)
        {                       
            len=USB_USART_RX_STA&0x3FFF;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
            usb_printf("Äú·¢Ë͵ÄÏûϢΪ:");
            for(t=0;t<len;t++)
            {
                USB_USART_SendData(USB_USART_RX_BUF[t]);//&#210;&#212;×&#214;&#189;&#218;·&#189;&#202;&#189;,·&#162;&#203;&#205;&#184;&#248;USB
            }
    //&#209;&#161;&#212;&#241;&#214;&#180;&#208;&#208;&#185;&#166;&#196;&#220;        
            data=(USB_USART_RX_BUF[0]-'0')*100+(USB_USART_RX_BUF[1]-'0')*10+USB_USART_RX_BUF[2]-'0';//&#187;&#241;&#181;&#195;&#202;&#253;&#190;&#221;data
            //m=USB_USART_RX_BUF[0]-'0';
            switch(data)
            {
                //&#181;&#231;&#209;&#185;&#188;ì&#178;&#226;
                case 100:adc_measure(ADC_Channel_0);break;
                case 101:adc_measure(ADC_Channel_1);break;
                case 102:adc_measure(ADC_Channel_2);break;
                case 103:adc_measure(ADC_Channel_3);break;
                case 104:adc_measure(ADC_Channel_4);break;
                case 105:adc_measure(ADC_Channel_5);break;
                default:usb_printf(" error ");break;
                case 106:adc_measure(ADC_Channel_6);break;
                case 107:adc_measure(ADC_Channel_7);break;
                case 108:adc_measure(ADC_Channel_8);break;
                case 109:adc_measure(ADC_Channel_9);break;
                case 110:adc_measure(ADC_Channel_10);break;
                case 111:adc_measure(ADC_Channel_11);break;
                case 112:adc_measure(ADC_Channel_12);break;
                case 113:adc_measure(ADC_Channel_13);break;
                case 114:adc_measure(ADC_Channel_14);break;
                case 115:adc_measure(ADC_Channel_15);break;
                case 116:adc_measure(ADC_Channel_16);break;



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

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1, ENABLE );      //&#202;&#185;&#196;&#220;ADC1&#205;¨&#181;&#192;&#202;±&#214;&#211;


    RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //&#201;è&#214;&#195;ADC·&#214;&#198;&#181;&#210;ò×&#211;6 72M/6=12,ADC×&#238;&#180;ó&#202;±&#188;&#228;&#178;&#187;&#196;&#220;&#179;&#172;&#185;&#253;14M

    //PA0/PA1/PA2/PA3/PA4/PA5/PA6/PA7 ×÷&#206;&#170;&#196;&#163;&#196;&#226;&#205;¨&#181;&#192;&#202;&#228;&#200;&#235;&#210;&#253;&#189;&#197;                        
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //&#196;&#163;&#196;&#226;&#202;&#228;&#200;&#235;&#210;&#253;&#189;&#197;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    //PB0/PB1 ×÷&#206;&#170;&#196;&#163;&#196;&#226;&#205;¨&#181;&#192;&#202;&#228;&#200;&#235;&#210;&#253;&#189;&#197;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //&#196;&#163;&#196;&#226;&#202;&#228;&#200;&#235;&#210;&#253;&#189;&#197;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    //PC0/PC1/PC2/PC3/PC4/PC5 ×÷&#206;&#170;&#196;&#163;&#196;&#226;&#205;¨&#181;&#192;&#202;&#228;&#200;&#235;&#210;&#253;&#189;&#197;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;        //&#196;&#163;&#196;&#226;&#202;&#228;&#200;&#235;&#210;&#253;&#189;&#197;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    ADC_DeInit(ADC1);  //&#184;&#180;&#206;&#187;ADC1,&#189;&#171;&#205;&#226;&#201;è ADC1 &#181;&#196;&#200;&#171;&#178;&#191;&#188;&#196;&#180;&#230;&#198;÷&#214;&#216;&#201;è&#206;&#170;&#200;±&#202;&#161;&#214;&#181;

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;    //ADC&#185;¤×÷&#196;&#163;&#202;&#189;:ADC1&#186;&#205;ADC2&#185;¤×÷&#212;&#218;&#182;&#192;&#193;&#162;&#196;&#163;&#202;&#189;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;    //&#196;&#163;&#202;&#253;×&#170;&#187;&#187;&#185;¤×÷&#212;&#218;&#181;&#165;&#205;¨&#181;&#192;&#196;&#163;&#202;&#189;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;    //&#196;&#163;&#202;&#253;×&#170;&#187;&#187;&#185;¤×÷&#212;&#218;&#181;&#165;&#180;&#206;×&#170;&#187;&#187;&#196;&#163;&#202;&#189;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;    //×&#170;&#187;&#187;&#211;&#201;&#200;í&#188;&#254;&#182;&#248;&#178;&#187;&#202;&#199;&#205;&#226;&#178;&#191;&#180;&#165;·&#162;&#198;&#244;&#182;&#175;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;    //ADC&#202;&#253;&#190;&#221;&#211;&#210;&#182;&#212;&#198;&#235;
    ADC_InitStructure.ADC_NbrOfChannel = 16;    //&#203;&#179;&#208;ò&#189;&#248;&#208;&#208;&#185;&#230;&#212;ò×&#170;&#187;&#187;&#181;&#196;ADC&#205;¨&#181;&#192;&#181;&#196;&#202;&#253;&#196;&#191;
    ADC_Init(ADC1, &ADC_InitStructure);    //&#184;ù&#190;&#221;ADC_InitStruct&#214;&#208;&#214;&#184;&#182;¨&#181;&#196;&#178;&#206;&#202;&#253;&#179;&#245;&#202;&#188;&#187;&#175;&#205;&#226;&#201;èADCx&#181;&#196;&#188;&#196;&#180;&#230;&#198;÷   

  
    ADC_Cmd(ADC1, ENABLE);    //&#202;&#185;&#196;&#220;&#214;&#184;&#182;¨&#181;&#196;ADC1
   
    ADC_ResetCalibration(ADC1);    //&#202;&#185;&#196;&#220;&#184;&#180;&#206;&#187;&#208;&#163;×&#188;  
     
    while(ADC_GetResetCalibrationStatus(ADC1));    //&#181;&#200;&#180;&#253;&#184;&#180;&#206;&#187;&#208;&#163;×&#188;&#189;á&#202;&#248;
   
    ADC_StartCalibration(ADC1);     //&#191;&#170;&#198;&#244;AD&#208;&#163;×&#188;

    while(ADC_GetCalibrationStatus(ADC1));     //&#181;&#200;&#180;&#253;&#208;&#163;×&#188;&#189;á&#202;&#248;

//    ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //&#202;&#185;&#196;&#220;&#214;&#184;&#182;¨&#181;&#196;ADC1&#181;&#196;&#200;í&#188;&#254;×&#170;&#187;&#187;&#198;&#244;&#182;&#175;&#185;&#166;&#196;&#220;

}                  
//&#187;&#241;&#181;&#195;ADC&#214;&#181;
//ch:&#205;¨&#181;&#192;&#214;&#181; 0~15
u16 Get_Adc(u8 ch)   
{
      //&#201;è&#214;&#195;&#214;&#184;&#182;¨ADC&#181;&#196;&#185;&#230;&#212;ò×é&#205;¨&#181;&#192;&#163;&#172;&#210;&#187;&#184;&#246;&#208;ò&#193;&#208;&#163;&#172;&#178;&#201;&#209;ù&#202;±&#188;&#228;
ADC_RegularChannelConfig(ADC1, ch, 16, ADC_SampleTime_239Cycles5 );    //ADC1,ADC&#205;¨&#181;&#192;,&#178;&#201;&#209;ù&#202;±&#188;&#228;&#206;&#170;239.5&#214;&#220;&#198;&#218;      

    ADC_SoftwareStartConvCmd(ADC1, ENABLE);        //&#202;&#185;&#196;&#220;&#214;&#184;&#182;¨&#181;&#196;ADC1&#181;&#196;&#200;í&#188;&#254;×&#170;&#187;&#187;&#198;&#244;&#182;&#175;&#185;&#166;&#196;&#220;   
     
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//&#181;&#200;&#180;&#253;×&#170;&#187;&#187;&#189;á&#202;&#248;

    return ADC_GetConversionValue(ADC1);    //·&#181;&#187;&#216;×&#238;&#189;ü&#210;&#187;&#180;&#206;ADC1&#185;&#230;&#212;ò×é&#181;&#196;×&#170;&#187;&#187;&#189;á&#185;&#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;
}      


PA1一接上3.3V,其他通道都显示3.3V,怀疑是ADC_Init()有问题,但不知道那个地方修改错了,有没有了解的大神给予帮助下

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。