<sup id="x7dny"><rp id="x7dny"><big id="x7dny"></big></rp></sup>
    • <label id="x7dny"><tt id="x7dny"><tfoot id="x7dny"></tfoot></tt></label>
      <dfn id="x7dny"></dfn>
      <small id="x7dny"><rp id="x7dny"><rt id="x7dny"></rt></rp></small>
      加入收藏 在線留言 聯系我們
      關注微信
      手機掃一掃 立刻聯系商家
      全國服務熱線18475208684

      西門子中國授權代理商-廣東省中山市

      更新時間
      2024-12-03 08:00:00
      價格
      請來電詢價
      西門子PLC
      西門子觸摸屏
      西門子伺服電機
      西門子變頻器
      西門子直流調速器
      西門子電纜
      聯系電話
      13922889745
      聯系手機
      18475208684
      聯系人
      向小姐
      立即詢價

      詳細介紹

      圖片



      項目需求


      在制作一個使用全向輪的機器人底盤,對于全向輪,電機的精度是影響效果的重要因素。所以使用了步進電機,使用步進電機的優點是可以不使用編碼器,開環控制即可達到高精度的效果。調整占空比或者調整周期眾所周知,PWM有兩個重要參數,周期與占空比。    步進電機的運動方式是,每收到一個脈沖,就旋轉指定的角度。因此影響電機速度的唯一參數就是PWM的頻率。以下附圖兩張來說明調整占空比與調整周期的區別。


      圖片

      ▲ 周期固定,調整占空比

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


      圖片

      ▲ 占空比固定,調整周期


      上圖中有4個PWM,它們的占空比都固定為50%,卻擁有不同的周期。可以看出,即使占空比固定,只要動態調整周期,PWM就能在相同時間內產生數量不同的脈沖。因此,固定占空比,動態調整PWM周期,即可達到控制步進電機速度的效果。基于STM32的實現在STM32F1中,定時器具有PWM模式,可以用來產生PWM。相關文章:STM32中PWM的配置與應用詳解。但是,STM32的PWM模式,只要確定了時基單元(即確定了PWM周期),改變輸出比較寄存器,僅可改變PWM的占空比。


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



      在多方查找資料后,確定了一種利用輸出比較jingque控制PWM周期的方式。利用輸出比較產生頻率可變的PWM利用輸出比較產生頻率可變的PWM,原理簡單介紹如下:


      首先配置定時器時基單元,確定脈沖Zui小長度單位CK。然后開啟定時器的輸出比較,設置模式為翻轉模式,并開啟輸出比較中斷。將定時器內計數器CNT當前值,加上脈沖長度X(單位為CK),寫入輸出比較寄存器。

      在X個CK后,將會觸發輸出比較中斷。同時電平翻轉。在中斷中再次將當前計數器CNT的值,加上脈沖長度X,寫入輸出比較寄存器。

      如此往復……

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


      確定Zui小單位CK,配置時基單元首先確定一個Zui小的間隔CK,規定PWM的高電平長度和低電平長度的單位都是CK。即高電平的長度一定是CK的整數倍。低電平亦然。然后配置定時器的時基單元,通過CK的長度確定預分頻系數。


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




    • PSC = 72M / (1/CK)
      例如,rtz所確定的CK長度為10us(0.00001s),即可得出方程。



      圖片



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









    • 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頻率的效果。


      聯系方式

      • 電  話:13922889745
      • 經理:向小姐
      • 手  機:18475208684
      • 微  信:18475208684