新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32的AD輸入口存在電壓的問題--連續轉換模式

        STM32的AD輸入口存在電壓的問題--連續轉換模式

        作者: 時間:2016-11-17 來源:網絡 收藏
        找到了AD輸入口存在電壓的問題

        今天重新整了一下程序,改變了思路,結果不但解決了數據出現錯位的問題.無意中居然把前面的問題也解決了,原先懷疑輸入阻抗引起的結論是錯誤的。真正的罪魁禍首是下面這句話:
        ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
        使用連續轉換模式,在采用電阻分壓取信號并且該分壓電阻很大的情況下,容易出現信號被引腳電壓淹沒的現象。至于該電壓為何在連續轉換模式下產生,現在我沒進一步研究。因為后來我的思路是不用連續轉換,結果什么問題都解決了,呵呵。
        上午我將Fadc改成16M,并且Ts設成最小(1.5Cycles),當電池拿掉后,量AD輸入口的電壓,約為0.04V,已經比較接近零了。接上電池(標準3.0V,滿的時候實際為3.2V)后,分壓點的電壓變成1.52V,讀到CPU內部經運算后的電壓為1.6V,這個數據實際上已經很好的,因為此時的輸入阻抗應該在1.2K以下了.看來應該重新理解一下AD的輸入阻抗了。

        本文引用地址:http://www.104case.com/article/201611/315432.htm

        故使用ADC單詞轉換模式解決這個問題

        例如,每隔30ms讀取4個AD口的數值,官方的例程只給出ADC+DMA的方式,這里采用非DMA方式。

        先配置IO口:

        GPIO_InitTypeDef gpioInitStruct;
        gpioInitStruct.GPIO_Speed = GPIO_Speed_50MHz;

        gpioInitStruct.GPIO_Pin = GPIO_Pin_3;
        gpioInitStruct.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOC, &gpioInitStruct);

        gpioInitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;
        gpioInitStruct.GPIO_Mode = GPIO_Mode_AIN;
        GPIO_Init(GPIOA, &gpioInitStruct);

        配置ADC:
        將ADC配置成非掃描方式(就是每次處理時不會掃描本組內的所有端口),因為采用規則組時只有一個寄存器保存adc結果;單次模式。

        ADC_InitTypeDef adcInitStruct;
        adcInitStruct.ADC_Mode = ADC_Mode_Independent;
        adcInitStruct.ADC_ScanConvMode = DISABLE;
        adcInitStruct.ADC_ContinuousConvMode = DISABLE;
        adcInitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        adcInitStruct.ADC_DataAlign = ADC_DataAlign_Right;
        adcInitStruct.ADC_NbrOfChannel = 1;

        //ADC自校驗:

        timeOut = 10000;
        ADC_ResetCalibration(ADC1);
        while((ADC_GetResetCalibrationStatus(ADC1)) && (timeOut--));

        timeOut = 10000;
        ADC_StartCalibration(ADC1);
        while((ADC_GetCalibrationStatus(ADC1)) && (timeOut--));

        每次掃描時調用函數:

        void sysGetAdcResult(void)
        {
        u8 i;

        for(i=0; i<4; i++)
        {
        _adcResult[i] = 0x0FFF;

        switch (i)
        {
        case 0: ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1, ADC_SampleTime_239Cycles5); break;
        case 1: ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5); break;
        case 2: ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_239Cycles5); break;
        case 3: ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_239Cycles5); break;
        }
        // 必須先調用ADC_Cmd()

        ADC_Cmd(ADC1, ENABLE);
        ADC_TempSensorVrefintCmd(ENABLE);
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);

        // 需要等待一段時間
        sysDelay(200);
        _adcResult[i] = ADC_GetConversionValue(ADC1);

        ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
        ADC_TempSensorVrefintCmd(DISABLE);
        ADC_SoftwareStartConvCmd(ADC1, DISABLE);
        ADC_Cmd(ADC1, DISABLE);
        }
        }

        .您在上面提到的采樣時間的選擇,AD轉換周期(TCONV) = 采樣時間+ 12.5個周期。如何選擇?依據是什么?

        要看外接的等效輸入電阻及電容。103的DATASHEET上有一個公式

        R(AIN)
        還有一個圖表

        Ts (cycles)tS (μs)RAIN max (kΩ)

        1.50.111.2

        7.50.5410

        13.50.9619

        28.52.0441

        41.52.9660

        55.53.9680

        71.55.11104

        239.517.1350


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 馆陶县| 哈巴河县| 嘉鱼县| 孟连| 偃师市| 和顺县| 惠东县| 颍上县| 福海县| 龙游县| 盐源县| 长春市| 永修县| 油尖旺区| 临武县| 静宁县| 兰州市| 德兴市| 邹平县| 荆州市| 建始县| 巫溪县| 红河县| 开远市| 罗田县| 盐城市| 石景山区| 斗六市| 汝南县| 台东市| 武鸣县| 鹤岗市| 洪江市| 宁安市| 云梦县| 隆回县| 昌江| 巴彦淖尔市| 普格县| 墨玉县| 普陀区|