找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8336|回复: 6
收起左侧

STM32F103+PWM+DMA精准控制输出脉冲的数量和频率 源程序

  [复制链接]
ID:561911 发表于 2020-8-24 14:33 | 显示全部楼层 |阅读模式
最近参加一个农业机器人的比赛,由于今年的题目是蔬菜幼苗自动搬运,因此搬运部分需要用到一个三轴运动的装置,我们参考了3D打印机的原理,上面通过步进电机控制丝杆和皮带从而带动我们的抓手来抓举幼苗。因为比赛的幼苗和幼苗的基质比较小,这个过程需要精度比较高,查询了一些资料后,我想到了用dma来给STM32单片机的定时器寄存器ARR发送数据来精准控制输出pwm的数量,从而可以精准控制步进电机转动的度数,可以十分方便的计算出到某个位置需要的脉冲。 MVIMG_20200819_143937.jpg 上图为我们的装置的三维图。
      stm32的DMA功能不需要使用中断,这是我选用这个方式的主要原因,因为我们这个项目所需要的步进电机比较多 ,如果通过中断的方式必然会使我们的程序比较混乱,而通过DMA的功能不占用CPU的运行,直接在目标地址之间发送数据。只要我们设置一个数组,将数组的最后一位设置为0,数组的长度就为pwm脉冲的数量,数组的数据就为ARR的值(即控制输出pwm的频率大小),十分方便。但这个方法有一个缺点就是如此长的数组比较占内存空间,这个可以通过共用一个数组和减少细分等方法解决。

单片机源程序如下:

  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 测试代码

  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();                     //延时函数初始化          
  29.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  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. }
复制代码

下载:
dma控制pwm测试代码.7z (186.23 KB, 下载次数: 314)

评分

参与人数 4黑币 +107 收起 理由
peeta + 12
hzd530 + 15
luliang02003 + 30 支持为农业做贡献的人
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:71535 发表于 2020-8-24 19:27 | 显示全部楼层
支持农业机器人比赛,蔬菜幼苗自动搬运可以减轻劳动强度,希望早日量产。
回复

使用道具 举报

ID:481073 发表于 2020-9-4 15:40 | 显示全部楼层
你好,请问能进一步交流吗,没太看懂您的代码
回复

使用道具 举报

ID:33544 发表于 2020-9-12 17:56 | 显示全部楼层
用PLC完成这样的项目,一小时就搞定
回复

使用道具 举报

ID:262645 发表于 2021-10-19 09:41 | 显示全部楼层
不行脉冲抖动太大
回复

使用道具 举报

ID:1033476 发表于 2022-8-27 11:19 | 显示全部楼层
为啥改成PA7就不可了
回复

使用道具 举报

ID:1091558 发表于 2023-10-29 10:55 | 显示全部楼层
不能加减速,还有待优化
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表