STM32CUBEMX—查表法实现SPWM
????????SPWM稱為正弦波脈寬調制,其原理是采用三角波作為載波,正弦波作為調制波合成后生成的等高不等寬的PWM波。在simulink仿真中直接用三角波模塊與sine wave合成即可,但對于編程來說比較麻煩,且運算較大占用CPU資源,一般采用查表法來實現正弦波。
?
?可以看到仿真的PWM信號是按照正弦規律變化。關于SPWM的知識不再贅述,下面用CUBEMX實現單片機的SPWM
????????我采用了STM32F4系列單片機,主頻可以到168MHZ,具體如何配置不再贅述。
????????首先需要PWM通道,這里我用了TIM8定時器,SPWM編程的核心思想就是在每個PWM周期改變其占空比。
????????這里有兩種方法分別是TIM8自帶的捕獲/比較中斷,在一個ARR周期內,當計數值大于CCR后觸發中斷,進而在中斷函數中更新CCR值。而第二種是開啟一個SPWM相匹配的定時器中斷來實現,比如實現10khz的SPWM就可以配置其他定時器一個10khz的中斷,在這個中斷里改變占空比。
????????這里是TIM8的配置,采用8400是因為第二種方法我采用了TIM2定時器,其APB1總線最大分頻只有84MHZ。
????????用第一種方法的話需要開啟捕獲中斷,第二種不用。
?第二種方法我采用了TIM2定時器,時鐘配置和TIM8一樣即可。
?
?配置好后需要正弦表,利用matlab就能實現,這里我直接給出360個采樣點,給后面電機電角度用。
volatile float SinTable[360] = {0.000e+00, 1.745e-02, 3.489e-02, 5.233e-02, 6.975e-02, 8.715e-02, 1.045e-01, 1.218e-01, 1.391e-01, 1.564e-01,1.736e-01, 1.908e-01, 2.079e-01, 2.249e-01, 2.419e-01, 2.588e-01, 2.756e-01, 2.923e-01, 3.090e-01, 3.255e-01,3.420e-01, 3.583e-01, 3.746e-01, 3.907e-01, 4.067e-01, 4.226e-01, 4.383e-01, 4.539e-01, 4.694e-01, 4.848e-01,5.000e-01, 5.150e-01, 5.299e-01, 5.446e-01, 5.591e-01, 5.735e-01, 5.877e-01, 6.018e-01, 6.156e-01, 6.293e-01,6.427e-01, 6.560e-01, 6.691e-01, 6.819e-01, 6.946e-01, 7.071e-01, 7.193e-01, 7.313e-01, 7.431e-01, 7.547e-01,7.660e-01, 7.771e-01, 7.880e-01, 7.986e-01, 8.090e-01, 8.191e-01, 8.290e-01, 8.386e-01, 8.480e-01, 8.571e-01,8.660e-01, 8.746e-01, 8.829e-01, 8.910e-01, 8.987e-01, 9.063e-01, 9.135e-01, 9.205e-01, 9.271e-01, 9.335e-01, 9.396e-01, 9.455e-01, 9.510e-01, 9.563e-01, 9.612e-01, 9.659e-01, 9.702e-01, 9.743e-01, 9.781e-01, 9.816e-01,9.848e-01, 9.876e-01, 9.902e-01, 9.925e-01, 9.945e-01, 9.961e-01, 9.975e-01, 9.986e-01, 9.993e-01, 9.998e-01,1.000e+00, 9.998e-01, 9.993e-01, 9.986e-01, 9.975e-01, 9.961e-01, 9.945e-01, 9.925e-01, 9.902e-01, 9.876e-01,9.848e-01, 9.816e-01, 9.781e-01, 9.743e-01, 9.702e-01, 9.659e-01, 9.612e-01, 9.563e-01, 9.510e-01, 9.455e-01,9.396e-01, 9.335e-01, 9.271e-01, 9.205e-01, 9.135e-01, 9.063e-01, 8.987e-01, 8.910e-01, 8.829e-01, 8.746e-01,8.660e-01, 8.571e-01, 8.480e-01, 8.386e-01, 8.290e-01, 8.191e-01, 8.090e-01, 7.986e-01, 7.880e-01, 7.771e-01,7.660e-01, 7.547e-01, 7.431e-01, 7.313e-01, 7.193e-01, 7.071e-01, 6.946e-01, 6.819e-01, 6.691e-01, 6.560e-01,6.427e-01, 6.293e-01, 6.156e-01, 6.018e-01, 5.877e-01, 5.735e-01, 5.591e-01, 5.446e-01, 5.299e-01, 5.150e-01,5.000e-01, 4.848e-01, 4.694e-01, 4.539e-01, 4.383e-01, 4.226e-01, 4.067e-01, 3.907e-01, 3.746e-01, 3.583e-01,3.420e-01, 3.255e-01, 3.090e-01, 2.923e-01, 2.756e-01, 2.588e-01, 2.419e-01, 2.249e-01, 2.079e-01, 1.908e-01,1.736e-01, 1.564e-01, 1.391e-01, 1.218e-01, 1.045e-01, 8.715e-02, 6.975e-02, 5.233e-02, 3.489e-02, 1.745e-02,1.224e-16,-1.745e-02, -3.489e-02, -5.233e-02, -6.975e-02, -8.715e-02, -1.045e-01, -1.218e-01, -1.391e-01, -1.564e-01, -1.736e-01, -1.908e-01, -2.079e-01, -2.249e-01, -2.419e-01, -2.588e-01, -2.756e-01, -2.923e-01, -3.090e-01, -3.255e-01, -3.420e-01, -3.583e-01, -3.746e-01, -3.907e-01, -4.067e-01, -4.226e-01, -4.383e-01, -4.539e-01, -4.694e-01, -4.848e-01,-5.000e-01, -5.150e-01, -5.299e-01, -5.446e-01, -5.591e-01, -5.735e-01, -5.877e-01, -6.018e-01, -6.156e-01, -6.293e-01, -6.427e-01, -6.560e-01, -6.691e-01, -6.819e-01, -6.946e-01, -7.071e-01, -7.193e-01, -7.313e-01, -7.431e-01, -7.547e-01, -7.660e-01, -7.771e-01, -7.880e-01, -7.986e-01, -8.090e-01, -8.191e-01, -8.290e-01, -8.386e-01, -8.480e-01, -8.571e-01,-8.660e-01, -8.746e-01, -8.829e-01, -8.910e-01, -8.987e-01, -9.063e-01, -9.135e-01, -9.205e-01, -9.271e-01, -9.335e-01, -9.396e-01, -9.455e-01, -9.510e-01, -9.563e-01, -9.612e-01, -9.659e-01, -9.702e-01, -9.743e-01, -9.781e-01, -9.816e-01, -9.848e-01, -9.876e-01, -9.902e-01, -9.925e-01, -9.945e-01, -9.961e-01, -9.975e-01, -9.986e-01, -9.993e-01, -9.998e-01, -1.000e+00,-9.998e-01, -9.993e-01, -9.986e-01, -9.975e-01, -9.961e-01, -9.945e-01, -9.925e-01, -9.902e-01, -9.876e-01, -9.848e-01, -9.816e-01, -9.781e-01, -9.743e-01, -9.702e-01, -9.659e-01, -9.612e-01, -9.563e-01, -9.510e-01, -9.455e-01, -9.396e-01, -9.335e-01, -9.271e-01, -9.205e-01, -9.135e-01, -9.063e-01, -8.987e-01, -8.910e-01, -8.829e-01, -8.746e-01, -8.660e-01, -8.571e-01, -8.480e-01, -8.386e-01, -8.290e-01, -8.191e-01, -8.090e-01, -7.986e-01, -7.880e-01, -7.771e-01, -7.660e-01, -7.547e-01, -7.431e-01, -7.313e-01, -7.193e-01, -7.071e-01, -6.946e-01, -6.819e-01, -6.691e-01, -6.560e-01, -6.427e-01, -6.293e-01, -6.156e-01, -6.018e-01, -5.877e-01, -5.735e-01, -5.591e-01, -5.446e-01, -5.299e-01, -5.150e-01, -5.000e-01, -4.848e-01, -4.694e-01, -4.539e-01, -4.383e-01, -4.226e-01, -4.067e-01, -3.907e-01, -3.746e-01, -3.583e-01, -3.420e-01, -3.255e-01, -3.090e-01, -2.923e-01, -2.756e-01, -2.588e-01, -2.419e-01, -2.249e-01, -2.079e-01, -1.908e-01, -1.736e-01, -1.564e-01, -1.391e-01, -1.218e-01, -1.045e-01, -8.715e-02, -6.975e-02, -5.233e-02, -3.489e-02, -1.745e-02}; //正弦表 __IO float SPWM_Duty1 = 0; //占空比 __IO int16_t sinTab1 = 0; //SPWM計數值然后開啟定時器
/* USER CODE BEGIN 2 */HAL_TIM_Base_Start_IT(&htim2);HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1);/* USER CODE END 2 */我只做了一相用于演示,三相會在電機里寫。
/* USER CODE BEGIN 4 */void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){SPWM_Duty1 =4200*(1+0.8*SinTable[sinTab1]); TIM8->CCR1=SPWM_Duty1;SPWM_Duty1++;if(SPWM_Duty1>= 359){SPWM_Duty1 = 0;}}/* USER CODE END 4 */? ? ? ? 調制度為0.8,第一段代碼的意思是正弦波從0開始對應占空比為50%,因此用4200乘上去,里面0.8是調制度,正弦表是從-1到1的一個數。也就是說PWM分頻4200即占空比50%對應0,正弦的1對應8400PWM分頻也就是1,如果PWM分頻為0就對應-1,最后++來查表步進到360清零。
如果是采用了第一種方法用內部捕獲中斷將回調函數修改為
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)最后初始化階段開啟中斷
HAL_TIM_PWM_Start_IT(&htim8,TIM_CHANNEL_1);?這里放個效果圖,是電機驅動信號放大后的,SPWM長這個樣子。
總結
以上是生活随笔為你收集整理的STM32CUBEMX—查表法实现SPWM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一段进程隐藏的代码
- 下一篇: tomcat无故宕机 哪位大神给看看