在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > stm32 ADC的規(guī)則通道和注入通道混合使用

            stm32 ADC的規(guī)則通道和注入通道混合使用

            作者: 時間:2016-11-10 來源:網絡 收藏
            之前完成了規(guī)則通道DMA的數(shù)據(jù)傳輸了,不過平時在使用ADC的時候可能就會遇到很多情況,不可能就這樣簡單的按規(guī)則通道來采樣,DMA存儲,使用數(shù)據(jù)的;可能有時候會需要立刻采樣,那樣我們就需要利用到注入通道了。文檔關于注入通道的解釋:
            1      利用外部觸發(fā)或通過設置ADC_CR2寄存器的ADON位,啟動一組規(guī)則通道的轉換。 2      如果在規(guī)則通道轉換期間產生一外部注入觸發(fā),當前轉換被復位,注入通道序列被以單次掃描方式進行轉換。 3      然后,恢復上次被中斷的規(guī)則組通道轉換。如果在注入轉換期間產生一規(guī)則事件,注入轉換不會被中斷,但是規(guī)則序列將在注入序列結束后被執(zhí)行。
              將變阻器的那路ADC設置為注入通道:
            1  ADC_InjectedSequencerLengthConfig(ADC1, 1);\設置注入通道長度2  ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);\配置注入通道3  ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);\開始注入通道數(shù)據(jù)采樣和轉換
              開始之后,延遲足夠的時間,讓ADC采樣和轉換完成。
            用ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);讀取注入通道1的數(shù)據(jù),結果發(fā)現(xiàn)數(shù)據(jù)一直不變,那肯定是哪里設置出錯了,找了下別人的設置,并做了一些嘗試,發(fā)現(xiàn)了原來是設置的問題,注入采樣的觸發(fā)方式沒有設置:
            ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
            這個函數(shù)設置注入方式使用軟件觸發(fā)方式,設置完之后用開始采樣和讀取數(shù)據(jù)函數(shù),就能采到正確的數(shù)據(jù)。
            上面的例子使用觸發(fā)注入完成的,下面又嘗試了自動注入。這樣每次進行規(guī)則通道采樣時,也會順便把注入通道也進行采樣了,而啟動注入通道采樣則不會對規(guī)則通道進行采樣。
            如果設置了 JAUTO 位,在規(guī)則組通道之后,注入組通道被自動轉換。這可以用來轉換在 ADC_SQRx 和 ADC_JSQR 寄存器中設置的多至 20 個轉換序列。
            還有在規(guī)則通道使用DMA數(shù)據(jù)傳輸,且使用注入通道采樣時,不知道會不會對數(shù)據(jù)有影響?
            查了下文檔,只有在規(guī)則通道的轉換結束時才產生 DMA 請求,并將轉換的數(shù)據(jù)從 ADC_DR 寄存器傳輸?shù)接脩糁付ǖ哪康牡刂?,還有注入方式轉換后數(shù)據(jù)存儲到 ADC_DRJx寄存器和規(guī)則方式轉換后數(shù)據(jù)存儲在ADC_DR寄存器中。
              在注入通道和規(guī)則通道的混合使用中,我花了不少時間去找正確的設置,問題是不知道哪些庫函數(shù)是必要的,哪些是非必要的,后來對著例子嘗試之后才知道。后面我還想了解下具體的寄存器設置,看了幾個初始化的函數(shù),發(fā)現(xiàn)其實很多設置都是對ADC_CR1的設置,有不少不明白的看了寄存器就知道了,看來函數(shù)的使用還是要和寄存器對應的位結合起來,這樣才能理解的透徹點。
              下面是我整個代碼的設置,其他設置和上篇例子一樣,只改了ADC設置:

            本文引用地址:http://www.biyoush.com/article/201611/317106.htm
            [cpp]view plaincopy
            1. staticvoidProtect_AdcInit(void)
            2. {
            3. ADC_InitTypeDefADC_InitStructure;
            4. ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;
            5. ADC_InitStructure.ADC_ScanConvMode=ENABLE;
            6. ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
            7. ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//軟件觸發(fā)
            8. ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
            9. ADC_InitStructure.ADC_NbrOfChannel=2;//規(guī)則通道的數(shù)量
            10. ADC_Init(ADC1,&ADC_InitStructure);//這個大部分是初始化規(guī)則通道的
            11. ADC_TempSensorVrefintCmd(ENABLE);
            12. ADC_RegularChannelConfig(ADC1,ADC_Channel_TempSensor,1,ADC_SampleTime_239Cycles5);
            13. ADC_RegularChannelConfig(ADC1,ADC_Channel_Vrefint,2,ADC_SampleTime_239Cycles5);
            14. ADC_InjectedSequencerLengthConfig(ADC1,1);
            15. ADC_InjectedChannelConfig(ADC1,ADC_Channel_10,1,ADC_SampleTime_7Cycles5);
            16. ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None);//設置規(guī)則通道軟件觸發(fā)
            17. /*Enableautomaticinjectedconversionstartafterregularone*/
            18. //ADC_AutoInjectedConvCmd(ADC1,ENABLE);
            19. ADC_DMACmd(ADC1,ENABLE);
            20. /*EnableADC1externaltrigger*/
            21. ADC_ExternalTrigConvCmd(ADC1,DISABLE);
            22. ADC_ExternalTrigInjectedConvCmd(ADC1,DISABLE);
            23. ADC_Cmd(ADC1,ENABLE);
            24. ADC_ResetCalibration(ADC1);
            25. while(ADC_GetResetCalibrationStatus(ADC1));
            26. ADC_StartCalibration(ADC1);
            27. while(ADC_GetCalibrationStatus(ADC1));
            28. }

            ======================沒完,繼續(xù)=================

            讀取數(shù)據(jù)在這里:

            /* 注入轉換中斷 */
            void ADC1_2_IRQHandler(void)
            {
            s32 inj_v1,inj_v2,inj_v3,inj_v4;


            if(ADC_GetITStatus(ADC1,ADC_IT_JEOC) == SET){
            ADC_ClearITPendingBit(ADC1,ADC_IT_JEOC);
            inj_v1 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);
            inj_v1 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_4);
            inj_v1 >>= 1;


            inj_v2 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_2);
            inj_v2 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_3);
            inj_v2 >>= 1;


            inj_v3 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_3);
            inj_v3 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_2);
            inj_v3 >>= 1;


            inj_v4 = ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_4);
            inj_v4 += ADC_GetInjectedConversionValue(ADC2,ADC_InjectedChannel_1);
            inj_v4 >>= 1;
            }
            }


            /* 規(guī)則轉換中斷 */
            void DMA1_Channel1_IRQHandler(void)
            {
            if(DMA_GetFlagStatus(DMA1_FLAG_TC1) == SET){
            DMA_ClearFlag(DMA1_FLAG_TC1);
            DMA_ClearITPendingBit(DMA1_IT_GL1);
            ADC_SoftwareStartConvCmd(ADC1,DISABLE);
            DMA_Cmd(DMA1_Channel1,DISABLE);


            /* ¼ÆËãת»»Öµ */
            regular_convert_calc();


            /* Æô¶¯ÏÂÒ»´Î´«Êä */
            DMA1_Channel1->CNDTR = NUM_OF_REG_CHANNEL;
            DMA_Cmd(DMA1_Channel1,ENABLE);
            ADC_SoftwareStartConvCmd(ADC1,ENABLE);
            }
            }

            還有這篇說的也不錯:用TIM1產生6路ADC,用CCR4觸發(fā)ADC1的注入通道采樣



            評論


            技術專區(qū)

            關閉