<dl id="b4zrn"><label id="b4zrn"></label></dl><thead id="b4zrn"></thead>

    <blockquote id="b4zrn"></blockquote>

      <strike id="b4zrn"></strike>
        1. <div id="b4zrn"><label id="b4zrn"></label></div>
          您好,歡迎訪問(wèn)上海意泓電子科技有限責(zé)任公司網(wǎng)站!
          4新聞資訊
          您的位置: 首頁(yè) ->  新聞資訊 -> 單片機(jī)

          ?stm32ADC非DMA模式的多通道采集與注入通道的采集

          文章出處:?jiǎn)纹瑱C(jī) 責(zé)任編輯:上海意泓電子科技有限責(zé)任公司 發(fā)表時(shí)間:
          2020
          11-10

          第一個(gè)為非DMA模式的多通道采集

          void ADC_DMA_Config(void) 

          {
          ADC_InitTypeDef ADC_InitStructure;

          RCC_HSICmd(ENABLE);
          while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);  
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
          ADC_DeInit(ADC1);
          ADC_StructInit(&ADC_InitStructure);
          ADC_InitStructure.ADC_Resolution = ADC_Resolution_8b; 
          ADC_InitStructure.ADC_ScanConvMode = DISABLE;  //禁止掃描模式
          ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;  //連續(xù)轉(zhuǎn)換
          ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; 
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
          ADC_InitStructure.ADC_NbrOfConversion = 1;

          ADC_Init(ADC1,&ADC_InitStructure);

          /*沒(méi)有采用中斷和DMA方式,這樣采樣得到的數(shù)據(jù)很容易丟失,因?yàn)橐?guī)則通道公用一個(gè)數(shù)據(jù)寄存器,因此需要在一個(gè)轉(zhuǎn)換周期內(nèi)讀出數(shù)據(jù),緊接著讀取下一個(gè)通道的數(shù)據(jù)。*/

          ADC_DelaySelectionConfig(ADC1, ADC_DelayLength_Freeze);//推遲到轉(zhuǎn)換后的數(shù)據(jù)被讀取

          ADC_PowerDownCmd(ADC1, ADC_PowerDown_Idle_Delay, ENABLE);//在延遲和空閑階段ADC是關(guān)閉的


          /* Enable ADC1 */
          ADC_Cmd(ADC1, ENABLE);
          /* Wait until the ADC1 is ready */
          while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ADONS) == RESET)

          }

          }

          uint16_t  GetADCValue(uint32_t CH_Data )//獲取通道數(shù)據(jù)
          {
              unsigned char  i;
              for(i=0; i<3; i++)
              {
                  AD_Value[i] = 0xFF;
                  switch (i)
                  {
                      case 0: ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_9Cycles); break;
                      case 1: ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_9Cycles); break;
              default: ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_9Cycles); break;
                  }
          ADC_Cmd(ADC1, ENABLE);
                 // ADC_TempSensorVrefintCmd(ENABLE);
                  ADC_SoftwareStartConv(ADC1);
                  while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) 
                  AD_Value[i] = ADC_GetConversionValue(ADC1);
                  ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
                  ADC_SoftwareStartConv(ADC1);
                  ADC_Cmd(ADC1, DISABLE);
              }
          return AD_Value[CH_Data];
          }


          第二個(gè)為dma多通道采樣與注入采樣

          __IO uint16_t ADC_ConvertedValue[2];//內(nèi)存緩存adc通道數(shù)據(jù)

          void ADC1_Mode_Config(void)
          {
          DMA_InitTypeDef DMA_InitStructure;
          ADC_InitTypeDef ADC_InitStructure;

          /* DMA channel1 configuration */
          DMA_DeInit(DMA1_Channel1);

          DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//ADC地址
          DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;//內(nèi)存地址
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
          DMA_InitStructure.DMA_BufferSize = 2;
          DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設(shè)地址固定
          DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //內(nèi)存地址后移
          DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//半字
          DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
          DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
          DMA_InitStructure.DMA_Priority = DMA_Priority_High;
          DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
          DMA_Init(DMA1_Channel1, &DMA_InitStructure);

          /* Enable DMA channel1 */
          DMA_Cmd(DMA1_Channel1, ENABLE);

          /* ADC1 configuration */
          ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//獨(dú)立ADC模式
          ADC_InitStructure.ADC_ScanConvMode = ENABLE ; //開(kāi)掃描模式
          ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//連續(xù)轉(zhuǎn)換
          ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//軟件觸發(fā)
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; 
          ADC_InitStructure.ADC_NbrOfChannel = 2;//轉(zhuǎn)換通道數(shù)目
          ADC_Init(ADC1, &ADC_InitStructure);


          ADC_TempSensorVrefintCmd(ENABLE);
          ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_55Cycles5);
          ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);


          ADC_InjectedSequencerLengthConfig(ADC1, 1); //注入通道與其長(zhǎng)度
            ADC_InjectedChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_7Cycles5);
          // ADC_SetInjectedOffset(ADC1, ADC_InjectedChannel_1, 1000);//設(shè)置偏置電壓值

          ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);

          ADC_ExternalTrigConvCmd(ADC1, DISABLE); //禁止外部觸發(fā)
          ADC_ExternalTrigInjectedConvCmd(ADC1, DISABLE);
          //ADC_AutoInjectedConvCmd(ADC1,ENABLE); //規(guī)則通道自動(dòng)轉(zhuǎn)換到注入通道
          /* Enable ADC1 DMA */
          ADC_DMACmd(ADC1, ENABLE);
          /* Enable ADC1 */
          ADC_Cmd(ADC1, ENABLE);

          ADC_ResetCalibration(ADC1);
          while(ADC_GetResetCalibrationStatus(ADC1));
          ADC_StartCalibration(ADC1);
          while(ADC_GetCalibrationStatus(ADC1));
          ADC_SoftwareStartConvCmd(ADC1, ENABLE);
          }

          由下面代碼可以得到注入通道ad值

          ADC_SoftwareStartInjectedConvCmd(ADC1, ENABLE);//啟動(dòng)adc注入通道
          while(RESET ==ADC_GetFlagStatus(ADC1,ADC_FLAG_JEOC));//等待轉(zhuǎn)換完成
          value=ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1);//得到第一組的值

          終于把ADC的非DMA的多通道采集完成,也是參考的網(wǎng)上的例子,學(xué)會(huì)了很多。其中要根據(jù)自己需求注意ADC是掃描模式,ADC是單次轉(zhuǎn)換還是連續(xù)轉(zhuǎn)換,還有ADC的模式也要注意。覺(jué)得ADC很博大精深,自己還得好好研究一番。


          上海意泓電子科技有限責(zé)任公司 版權(quán)所有 未經(jīng)授權(quán)禁止復(fù)制或鏡像

          CopyRight 2020-2025 m.frontgate.com.cn All rights reserved   滬ICP備2021005866號(hào)

          久艹视频在线观看这里只有精品,国语自产拍在线视频普通话94,久久婷婷综合缴情亚洲狠狠,亚洲不卡永远在线精品无码
          <dl id="b4zrn"><label id="b4zrn"></label></dl><thead id="b4zrn"></thead>

            <blockquote id="b4zrn"></blockquote>

              <strike id="b4zrn"></strike>
                1. <div id="b4zrn"><label id="b4zrn"></label></div>