標(biāo)題: STM32F103+PWM+DMA精準(zhǔn)控制輸出脈沖的數(shù)量和頻率 源程序 [打印本頁(yè)]

作者: hhhhhhaa    時(shí)間: 2020-8-24 14:33
標(biāo)題: STM32F103+PWM+DMA精準(zhǔn)控制輸出脈沖的數(shù)量和頻率 源程序
最近參加一個(gè)農(nóng)業(yè)機(jī)器人的比賽,由于今年的題目是蔬菜幼苗自動(dòng)搬運(yùn),因此搬運(yùn)部分需要用到一個(gè)三軸運(yùn)動(dòng)的裝置,我們參考了3D打印機(jī)的原理,上面通過(guò)步進(jìn)電機(jī)控制絲桿和皮帶從而帶動(dòng)我們的抓手來(lái)抓舉幼苗。因?yàn)楸荣惖挠酌绾陀酌绲幕|(zhì)比較小,這個(gè)過(guò)程需要精度比較高,查詢了一些資料后,我想到了用dma來(lái)給STM32單片機(jī)的定時(shí)器寄存器ARR發(fā)送數(shù)據(jù)來(lái)精準(zhǔn)控制輸出pwm的數(shù)量,從而可以精準(zhǔn)控制步進(jìn)電機(jī)轉(zhuǎn)動(dòng)的度數(shù),可以十分方便的計(jì)算出到某個(gè)位置需要的脈沖。 上圖為我們的裝置的三維圖。
      stm32的DMA功能不需要使用中斷,這是我選用這個(gè)方式的主要原因,因?yàn)槲覀冞@個(gè)項(xiàng)目所需要的步進(jìn)電機(jī)比較多 ,如果通過(guò)中斷的方式必然會(huì)使我們的程序比較混亂,而通過(guò)DMA的功能不占用CPU的運(yùn)行,直接在目標(biāo)地址之間發(fā)送數(shù)據(jù)。只要我們?cè)O(shè)置一個(gè)數(shù)組,將數(shù)組的最后一位設(shè)置為0,數(shù)組的長(zhǎng)度就為pwm脈沖的數(shù)量,數(shù)組的數(shù)據(jù)就為ARR的值(即控制輸出pwm的頻率大。,十分方便。但這個(gè)方法有一個(gè)缺點(diǎn)就是如此長(zhǎng)的數(shù)組比較占內(nèi)存空間,這個(gè)可以通過(guò)共用一個(gè)數(shù)組和減少細(xì)分等方法解決。

單片機(jī)源程序如下:

  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "usart.h"
  6. #include "timer.h"
  7. #include "dma.h"
  8. /************************************************
  9. dma + pwm 測(cè)試代碼

  10. ************************************************/
  11. #define size 8000
  12. u16 send_buf[size];
  13. u32 i;
  14. void pwm_out(int step_count,int arr)
  15. {
  16.         for(i=0;i<step_count;i++)
  17.         {
  18.                 if(i < step_count-1)
  19.                         send_buf[i]=arr;
  20.                 else
  21.                         send_buf[i]=0;
  22.         }
  23.         MYDMA_Enable(DMA1_Channel6,step_count);
  24. }
  25. int main(void)
  26. {               
  27.         u8 count = 5;
  28.         delay_init();                     //延時(shí)函數(shù)初始化          
  29.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
  30.         uart_init(115200);         //串口初始化為115200
  31.         LED_Init();                             //LED端口初始化

  32.          MYDMA_Config(DMA1_Channel6, (u32)&TIM3->ARR, (u32)send_buf, size);
  33.         TIM3_PWM_Init(2000,100-1);         //不分頻。PWM頻率=72000000/900=80Khz                        PA6
  34.         TIM_SetCompare1(TIM3,500);       
  35.         pwm_out(1000,1000);
  36.        
  37.        
  38.   while(1)
  39.         {               
  40.                
  41.                         if(TIM3->ARR==0)
  42.                         {

  43.                                         pwm_out(1000,1000);
  44.                         }
  45.                         delay_ms(50000);
  46.                
  47.         }
  48. }
復(fù)制代碼

下載:
dma控制pwm測(cè)試代碼.7z (186.23 KB, 下載次數(shù): 321)



作者: waerdeng    時(shí)間: 2020-8-24 19:27
支持農(nóng)業(yè)機(jī)器人比賽,蔬菜幼苗自動(dòng)搬運(yùn)可以減輕勞動(dòng)強(qiáng)度,希望早日量產(chǎn)。
作者: 流星2019    時(shí)間: 2020-9-4 15:40
你好,請(qǐng)問(wèn)能進(jìn)一步交流嗎,沒(méi)太看懂您的代碼

作者: wis98    時(shí)間: 2020-9-12 17:56
用PLC完成這樣的項(xiàng)目,一小時(shí)就搞定
作者: 安shijia    時(shí)間: 2021-10-19 09:41
不行脈沖抖動(dòng)太大
作者: HQing1    時(shí)間: 2022-8-27 11:19
為啥改成PA7就不可了
作者: sbdt    時(shí)間: 2023-10-29 10:55
不能加減速,還有待優(yōu)化




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1