天天看點

stm32 TIM2定時器觸發ADC、DMA采樣

        使用ADC的定時器觸發ADC轉換的功能,然後使用DMA進行資料的搬運!采用TIM2定時器的觸發間隔,實作ADC定時采樣轉換的功能,然後可以在程式的死循環中一直檢測DMA轉換完成标志,然後進行資料的讀取,或者使能DMA轉換完成中斷,這樣每次轉換完成就會産生中斷。 

        做示波器時,由于要做調整橫坐标顯示倍數增大和縮小,故需要改變采樣頻率,也就是改變TIM2 的定時器時間間隔,在TIM2初始化函數定義時,添加u16 Value參數,第一次調試時,設定如下:

  • 定時器2初始化函數void TIM2_Configuration(u16 Value),配置TIM_Period = Value - 1;

            TIM_TimeBaseStructure.TIM_Period = Value - 1;//設定2ms一次TIM2比較的周期(注意此處!!!)

            TIM_TimeBaseStructure.TIM_Prescaler = 1;//系統主頻56M,這裡2分頻 (注意此處!!!)

  • DMA配置:

            DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;//記憶體存儲基位址

            DMA_InitStructure.DMA_BufferSize = 2000;//DMA緩存大小,2000個

  •  ADC配置:

            ADC_InitStructure.ADC_ScanConvMode =DISABLE;//關閉掃描模式 因為隻有一個通道

            ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;//關閉連續轉換模式 否則隻要觸發一次,後續的轉換就會永不停歇(除非CONT清0),這樣第一次以後的ADC,就不是由TIM2_CC2來觸發了

            ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;//軟體轉換模式  

       示波器中為防止波形頻閃,需要用到觸發電平。想讓觸發點定在螢幕中間,在第一次上電觸發脈沖到來時,需要DMA中有至少半屏的資料,若半屏為240個點,則另外需要一個定時器來控制這個時間,采用TIM4,設定如下:

           TIM_TimeBaseStructure.TIM_Period = 240*Value -1;     //240個點的定時時間   (注意此處!!!)

           TIM_TimeBaseStructure.TIM_Prescaler = 1;         //系統主頻56M,這裡2分頻 (注意此處!!!)

        當TIM2定時時間到,使能觸發中斷。當觸發脈沖到來時,記下目前位置,即為觸發位置。禁能觸發中斷并再次啟動定時器,采集另外240個點。從上述位置左右各取240個點,顯示在螢幕上即可;

  • 遇到的問題:

        1、在調整Value值來改變TIM2的時間間隔,240個點的定時時間出錯,理論上在進入TIM4的中斷時,應采樣240多個點(比如為140時,采樣242個點),但是Value為280時,才7個點。

        分析:

        通過檢視TIM_Period的資料類型發現,其為u16,即unsigned short,範圍為0-65536,當Value為280時,TIM4的TIM_Period為67200,超過了u16的範圍,實際設定的TIM_Period值為1664-1。

  • TIM4的時間間隔:

      ((1+TIM_Prescaler )/56M)*(1+TIM_Period )=((1+1)/56M)*(1+1664-1)=59.4us 

  • 采樣周期:

      ((1+TIM_Prescaler )/56M)*(1+TIM_Period )=((1+1)/56M)*(1+280-1)=10us 

通過以上計算,發現Value為280時,為6采樣周期,與7個點的時間相差無幾,終于找出問題所在;

        解決:

        由于定時器的分頻TIM_Prescaler 設定的比較小,TIM4的TIM_Period 又做了240的乘數,想要增大定時器時間間隔,使得Value很容易超範圍,可将TIM_Prescaler設定為19,采樣周期為10us(即定時器TIM2時間間隔),Value隻需設定為28即可。

       2、以上是Value過大時出現的問題,但當Value比較小時,還是在原來的TIM設定條件下,TIM_Prescaler  = 1,當Value小于28時,當TIM4定時時間到時,隻采集了100多個點。

        分析:        

        ADC轉換就是輸入模拟的信号量,單片機轉換成數字量。讀取數字量必須等轉換完成後,完成一個通道的讀取叫做采樣周期。采樣周期一般來說=轉換時間+讀取時間。而轉換時間=采樣時間+12.5個時鐘周期。

        CPU的頻率為56MHz ,ADC取4分頻,即為14MHz,則ADC總轉換時間為:TCONV = 1.5 + 12.5 = 14周期= 14/14M = 1μs

        故采一個點的時間理論上略大于1us,而在Value設定為28時,TIM2的時間間隔正好為1us,導緻240us實際采集的點數比較少,通過多次試驗,修改Value的值,發現當取值為32是正好采樣正确,為31時則不行,通過計算為1.1us,故需要設定TIM2的采樣間隔大于此數值即可。

繼續閱讀