|
最近參加一個農(nóng)業(yè)機(jī)器人的比賽,由于今年的題目是蔬菜幼苗自動搬運(yùn),因此搬運(yùn)部分需要用到一個三軸運(yùn)動的裝置,我們參考了3D打印機(jī)的原理,上面通過步進(jìn)電機(jī)控制絲桿和皮帶從而帶動我們的抓手來抓舉幼苗。因?yàn)楸荣惖挠酌绾陀酌绲幕|(zhì)比較小,這個過程需要精度比較高,查詢了一些資料后,我想到了用dma來給STM32單片機(jī)的定時器寄存器ARR發(fā)送數(shù)據(jù)來精準(zhǔn)控制輸出pwm的數(shù)量,從而可以精準(zhǔn)控制步進(jìn)電機(jī)轉(zhuǎn)動的度數(shù),可以十分方便的計(jì)算出到某個位置需要的脈沖。
MVIMG_20200819_143937.jpg (16.83 MB, 下載次數(shù): 103)
下載附件
2020-8-24 14:24 上傳
上圖為我們的裝置的三維圖。
stm32的DMA功能不需要使用中斷,這是我選用這個方式的主要原因,因?yàn)槲覀冞@個項(xiàng)目所需要的步進(jìn)電機(jī)比較多 ,如果通過中斷的方式必然會使我們的程序比較混亂,而通過DMA的功能不占用CPU的運(yùn)行,直接在目標(biāo)地址之間發(fā)送數(shù)據(jù)。只要我們設(shè)置一個數(shù)組,將數(shù)組的最后一位設(shè)置為0,數(shù)組的長度就為pwm脈沖的數(shù)量,數(shù)組的數(shù)據(jù)就為ARR的值(即控制輸出pwm的頻率大小),十分方便。但這個方法有一個缺點(diǎn)就是如此長的數(shù)組比較占內(nèi)存空間,這個可以通過共用一個數(shù)組和減少細(xì)分等方法解決。
單片機(jī)源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "usart.h"
- #include "timer.h"
- #include "dma.h"
- /************************************************
- dma + pwm 測試代碼
-
- ************************************************/
- #define size 8000
- u16 send_buf[size];
- u32 i;
- void pwm_out(int step_count,int arr)
- {
- for(i=0;i<step_count;i++)
- {
- if(i < step_count-1)
- send_buf[i]=arr;
- else
- send_buf[i]=0;
- }
- MYDMA_Enable(DMA1_Channel6,step_count);
- }
- int main(void)
- {
- u8 count = 5;
- delay_init(); //延時函數(shù)初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
- uart_init(115200); //串口初始化為115200
- LED_Init(); //LED端口初始化
- MYDMA_Config(DMA1_Channel6, (u32)&TIM3->ARR, (u32)send_buf, size);
- TIM3_PWM_Init(2000,100-1); //不分頻。PWM頻率=72000000/900=80Khz PA6
- TIM_SetCompare1(TIM3,500);
- pwm_out(1000,1000);
-
-
- while(1)
- {
-
- if(TIM3->ARR==0)
- {
- pwm_out(1000,1000);
- }
- delay_ms(50000);
-
- }
- }
復(fù)制代碼
下載:
dma控制pwm測試代碼.7z
(186.23 KB, 下載次數(shù): 321)
2020-8-24 15:01 上傳
點(diǎn)擊文件名下載附件
dma控制pwm測試代碼 下載積分: 黑幣 -5
|
評分
-
查看全部評分
|