<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32的步進電機速度控制

STM32嵌入式開發 ? 來源:搜狐網 ? 作者:搜狐網 ? 2020-09-23 10:51 ? 次閱讀

項目需求

在制作一個使用全向輪的機器人底盤,對于全向輪,電機的精度是影響效果的重要因素。所以使用了步進電機,使用步進電機的優點是可以不使用編碼器,開環控制即可達到高精度的效果。

調整占空比或者調整周期

眾所周知,PWM有兩個重要參數,周期與占空比。
步進電機的運動方式是,每收到一個脈沖,就旋轉指定的角度。因此影響電機速度的唯一參數就是PWM的頻率。以下附圖兩張來說明調整占空比與調整周期的區別。

周期固定,調整占空比


上圖中有4個PWM,它們的周期是一樣的,不同之處是擁有從80%至20%的占空比??梢钥闯?,無論占空比為多少,在1s內,它們產生的高電平的數量是一樣的,即無論占空比為多少,PWM的頻率都一致。因此也就無法調整步進電機的速度。因為步進電機的速度僅與PWM的頻率有關。

占空比固定,調整周期


上圖中有4個PWM,它們的占空比都固定為50%,卻擁有不同的周期??梢钥闯?,即使占空比固定,只要動態調整周期,PWM就能在相同時間內產生數量不同的脈沖。因此,固定占空比,動態調整PWM周期,即可達到控制步進電機速度的效果。

基于STM32的實現

在STM32F1中,定時器具有PWM模式,可以用來產生PWM。但是,STM32的PWM模式,只要確定了時基單元(即確定了PWM周期),改變輸出比較寄存器,僅可改變PWM的占空比。

若需要改變PWM周期,需不停地改變定時器的時基單元。但時基單元與硬件相關,不適合頻繁變更。因此,步進電機的調速,不適合使用STM32下定時器的PWM模式來控制。

在多方查找資料后,確定了一種利用輸出比較精確控制PWM周期的方式。

利用輸出比較產生頻率可變的PWM

利用輸出比較產生頻率可變的PWM,原理簡單介紹如下:

首先配置定時器時基單元,確定脈沖最小長度單位CK。

然后開啟定時器的輸出比較,設置模式為翻轉模式,并開啟輸出比較中斷。

將定時器內計數器CNT當前值,加上脈沖長度X(單位為CK),寫入輸出比較寄存器。

在X個CK后,將會觸發輸出比較中斷。同時電平翻轉。

在中斷中再次將當前計數器CNT的值,加上脈沖長度X,寫入輸出比較寄存器。

在X個CK后,將會觸發輸出比較中斷。同時電平翻轉。

在中斷中再次將當前計數器CNT的值,加上脈沖長度X,寫入輸出比較寄存器。

如此往復……

以此即可得到一個占空比為50%,周期為2X個CK的PWM。

確定最小單位CK,配置時基單元

首先確定一個最小的間隔CK,規定PWM的高電平長度和低電平長度的單位都是CK。

即高電平的長度一定是CK的整數倍。低電平亦然。

然后配置定時器的時基單元,通過CK的長度確定預分頻系數。

已知STM32F103的主頻為72MHZ,則時基單元中預分頻系數為

PSC = 72M / (1/CK)

例如,rtz所確定的CK長度為10us(0.00001s)。即可得出方程

PSC = 72M / (1/0.00001)=72000000/100000=720

預分頻系數確定為720后,由高速晶振產生的72MHZ的時鐘信號被720分頻,得到100000HZ的時鐘信號。即時鐘信號每秒變動100000次。每次10us。同時可將重裝載值設定為0XFFFF(16位定時器的最大值)。因為本次使用的輸出比較模式不使用更新中斷,該值可隨意設置。

TIM_TimeBaseStructure.TIM_Period = 0XFFFF;TIM_TimeBaseStructure.TIM_Prescaler =720;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

開啟輸出比較通道,設置輸出比較模式為翻轉模式,并配置NVIC,開啟輸出比較中斷,配置輸出比較通道:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;TIM_OCInitStructure.TIM_Pulse = 500;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;TIM_OC1Init(TIM2, &TIM_OCInitStructure);

開啟輸出比較中斷,配置NVIC優先級:

TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);

編寫中斷服務函數

在輸出比較中斷中,唯一要做的事情就是把當前CNT的值取出,加上脈沖長度X,寫入輸出比較寄存器。

當計數器達到0XFFFF(之前設定的重裝載值)后,再加一會自動變為0.

例如,當前CNT值為0XFFFF,脈沖長度為5,很明顯,輸出比較寄存器應設置為0X0004才可觸發下一次中斷,而不是0X10004,這樣會造成溢出。

因此將CNT的值與脈沖長度相加后,需要取0XFFFF的余數后,再寫入輸出比較寄存器。

int t_m=5;//低電平和高電平的長度void TIM2_IRQHandler(void){ if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) { TIM_SetCompare1(TIM2,(TIM2-》CNT+t_m)%0XFFFF); TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); }}

動態調整中斷服務函數中的變量t_m,即可達到修改PWM頻率的效果。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2247

    文章

    10691

    瀏覽量

    349897
  • 步進電機
    +關注

    關注

    149

    文章

    2971

    瀏覽量

    146370

原文標題:STM32實例-步進電機的速度控制

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    步進電機速度控制

    步進電機速度控制方法步進電機是將電脈沖信號轉變為角位移或線位移的開環
    發表于 01-11 15:02

    基于Stm32F407的多路步進電機速度控制函數

    應學弟們的要求特意將步進電機速度控制函數完善。重點: 這里只是速度控制函數, 沒有加減速曲線!
    發表于 06-29 06:52

    stm32控制步進電機速度

    stm32控制步進電機速度,利用stm32控制
    發表于 07-08 07:29

    步進電機速度控制及運動規律

    步進電機速度控制及運動規律 步進電機區別于其他控制
    發表于 09-17 15:07 ?9264次閱讀
    <b class='flag-5'>步進</b><b class='flag-5'>電機</b>的<b class='flag-5'>速度</b><b class='flag-5'>控制</b>及運動規律

    STM32控制步進電機插補法畫直線

    使用STM32編程序控制兩相步進電機實現簡單的直線插補。
    發表于 11-09 14:20 ?192次下載

    基于STM32步進電機轉速控制實驗設計

    基于STM32步進電機轉速控制實驗設計
    發表于 09-28 16:00 ?79次下載
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>步進</b><b class='flag-5'>電機</b>轉速<b class='flag-5'>控制</b>實驗設計

    基于STM32步進電機控制系統

    摘 要 本文的主要工作是基于STM32步進電機控制系統的設計。隨著越來越多的高科技產品逐漸融入了日常生活中,步進
    發表于 11-27 18:49 ?92次下載

    使用PLC如何控制步進電機速度與方向

    步進電機是一種很常見的動力元件,步進電機可以很方便的由控制系統控制速度與轉動方向。那么使用PL
    的頭像 發表于 02-16 22:37 ?2.1w次閱讀
    使用PLC如何<b class='flag-5'>控制</b><b class='flag-5'>步進</b><b class='flag-5'>電機</b>的<b class='flag-5'>速度</b>與方向

    基于DSP的步進電機速度控制系統

    本文步進電機原理及DSP控制方法,進行了步進電機速度控制
    發表于 06-07 09:11 ?28次下載

    stm32F4 定時器中斷 + 步進電機控制控制四線兩相步進電機 (初級版本)

    引出MCU是 stm32F407ZGT6 最小系統板根據步進電機控制器的資料可以知道 步進電機
    發表于 12-05 12:51 ?0次下載
    <b class='flag-5'>stm32</b>F4  定時器中斷 + <b class='flag-5'>步進</b><b class='flag-5'>電機</b><b class='flag-5'>控制</b>器 <b class='flag-5'>控制</b>四線兩相<b class='flag-5'>步進</b><b class='flag-5'>電機</b> (初級版本)

    STM32控制啟動步進電機

    STM32控制啟動步進電機概述正在做的項目需要用STM32控制
    發表于 12-24 19:30 ?87次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>控制</b>啟動<b class='flag-5'>步進</b><b class='flag-5'>電機</b>

    基于STM32步進電機驅動設計

    ------一個固定的角度(及步進角)??梢酝ㄟ^控制脈沖個來控制角位移量,從而達到準確定位的目的;同時可以通過控制脈沖頻率來控制
    發表于 03-16 10:29 ?20次下載
    基于<b class='flag-5'>STM32</b>的<b class='flag-5'>步進</b><b class='flag-5'>電機</b>驅動設計

    STM32實例之步進電機速度控制

    在制作一個使用全向輪的機器人底盤,對于全向輪,電機的精度是影響效果的重要因素。所以使用了步進電機,使用步進電機 的優點是可以不使用編碼器,開
    發表于 03-22 09:42 ?3次下載
    <b class='flag-5'>STM32</b>實例之<b class='flag-5'>步進</b><b class='flag-5'>電機</b>的<b class='flag-5'>速度</b><b class='flag-5'>控制</b>

    plc如何控制步進電機速度和方向?

    plc作為一種工業控制計算機,具有模塊化結構、配置靈活、高速的處理速度、精確的數據處理能力、PLC對步進電機也具有良好的控制能力,利用其高速
    的頭像 發表于 08-07 08:09 ?1548次閱讀
    plc如何<b class='flag-5'>控制</b><b class='flag-5'>步進</b><b class='flag-5'>電機</b>的<b class='flag-5'>速度</b>和方向?

    步進電機控制器怎么調速度

    引言 步進電機是一種將電脈沖信號轉換為角位移的電機,具有控制精度高、響應速度快、結構簡單等優點。在自動化設備、機器人、數控機床等領域得到了廣
    的頭像 發表于 06-12 09:17 ?181次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>