新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32的ADC實測

        STM32的ADC實測

        作者: 時間:2016-11-13 來源:網絡 收藏
          測試芯片:STM32F103R8T6 (雙AD)

          編譯平臺:IAR5.40
          測試概述:使用片內振蕩器時鐘HSI,雙ADC同步采樣,ADC1采用DMA1存放,ADC2采用直接讀取。
               每讀取十個采樣值計數一次,定時一秒鐘,通過串口將采樣次數送出,測試ADC采樣速率。

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

        一、主頻設為:56MHz
          使用HSI,STM32F103最高頻率可達72MHz,主頻在56MHz時AD速率最大。
          RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_14);   // 8 ÷ 2 × 14 = 56MHz

        二、ADC工作頻率:14MHz
          RCC_ADCCLKConfig(RCC_PCLK2_Div4);
          RCC_HCLKConfig(RCC_SYSCLK_Div1);
          RCC_PCLK2Config(RCC_HCLK_Div1);
          RCC_PCLK1Config(RCC_HCLK_Div2);
          RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
          // 56 ÷ 4 = 14MHz

        三、TIM2設置1s中斷
          TIM_TimeBaseStructure.TIM_Period = 2240; // 1s// for 103
          TIM_TimeBaseStructure.TIM_Prescaler = 0x00; // for 103
          TIM_TimeBaseStructure.TIM_ClockDivision = 0;
          TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
          TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
          TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
          TIM_PrescalerConfig(TIM2, 25000-1, TIM_PSCReloadMode_Immediate);// for 103
          // TIM2CLK = 56 ÷2 = 28MHz
          // 2240 × 25000 ÷ (28MHz × 2) = 1s

        四、DMA設置
          只有ADC1和ADC3有DMA功能,而STM32F103只有ADC1和ADC2,所以DMA只設置存放ADC1的數據,ADC2直接讀取。
          緩存大小設為10個單位數據,每存放10個數據FLAG_TC1置高,通知記錄采樣次數。
          #define ADC1_DR_Address ((uint32_t)ADC1_BASE+0x4C)
          #define ADC2_DR_Address ((uint32_t)ADC2_BASE+0x4C)
          __IO uint32_t ADC1_ConvertedValueTab[2];
          RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
          DMA_DeInit(DMA1_Channel1);
          DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;
          DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC1_ConvertedValueTab;
          DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
          DMA_InitStructure.DMA_BufferSize = 10;
          DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
          DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
          DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
          DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
          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);
          DMA_Cmd(DMA1_Channel1, ENABLE);

        五、ADC設置
          雙AD同步采樣模式,不掃描,連續采樣,1個規則通道
          ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
          ADC_InitStructure.ADC_ScanConvMode = DISABLE;
          ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
          ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
          ADC_InitStructure.ADC_NbrOfChannel = 1;
          ADC_Init(ADC1, &ADC_InitStructure);
          ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_1Cycles5);
         ADC_ITConfig(ADC1, ADC_IT_EOC, DISABLE);
          ADC_DMACmd(ADC1, ENABLE);

         ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;
          ADC_InitStructure.ADC_ScanConvMode = DISABLE;
         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
          ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
          ADC_InitStructure.ADC_NbrOfChannel = 1;
          ADC_Init(ADC2, &ADC_InitStructure);
          ADC_RegularChannelConfig(ADC2, ADC_Channel_5, 1, ADC_SampleTime_1Cycles5);
          ADC_ITConfig(ADC2, ADC_IT_EOC, ENABLE);

        六、主程序
        while(1)
        {
          while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC)==RESET);
          DMA_ClearFlag(DMA1_FLAG_TC1);
          dd = (u16)ADC2->DR;
          ADC_ClearITPendingBit(ADC2, ADC_IT_EOC);
          min_cnt++;
        }

        七、中斷處理
        void TIM2_IRQHandler(void)
        {
          if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
          {
            send_data(min_cnt);   // 通過串口檢查數據
            min_cnt = 0;
          }
          TIM2->SR = 0x00;
        }

        八、測試結果  

          
          結論:STM32F103的AD轉換速率可高達1MSPS。雙AD可高達2MSPS。
             據手冊所示,STM32F2的AD速率可達2MSPS,STM32F4的AD速率可高達2.4MSPS。



        關鍵詞: STM32AD

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 伊春市| 宁城县| 平南县| 吴堡县| 昭觉县| 开远市| 苏州市| 郯城县| 固阳县| 呼伦贝尔市| 山西省| 徐汇区| 鱼台县| 九龙县| 来凤县| 夹江县| 南乐县| 海口市| 津市市| 垣曲县| 孝义市| 安龙县| 晴隆县| 临颍县| 敖汉旗| 北碚区| 桐庐县| 海晏县| 文昌市| 大化| 得荣县| 顺义区| 长武县| 岳阳县| 囊谦县| 亚东县| 张家港市| 沾化县| 东明县| 五华县| 甘泉县|