×
单片机 > 单片机程序设计 > 详情

stm32 dma方式发脉冲做位置控制

发布时间:2020-05-18 发布时间:
|
考虑到现有板子上没有fpga,对于dma方式发脉冲做位置控制设计如下
两个buff
short buff1[1000];
short buff2[1000];

里面都存放频率值,也就是说arp寄存器的值。

数组的长度为1000,是考虑到最高的脉冲频率,如果最大频率比较小,则可以适当减少数组的大小,之所以定义两个buff,是考虑到每个伺服周期计算填充一个buff,同时另一个buff就作为当前dma之用,每个伺服周期结束的时候会停止dma,然后统计已发脉冲数量,然后切换到刚刚填充好的buff,然后启动dma发脉冲。
因为dma发脉冲更新的寄存器是arp,对于ccr脉宽寄存器,则每个伺服周期开始的时候,程序自己填充即可。

上面的dma发送的方法,优点是频率高、发送的数量可以保证、不占用cpu,缺点是占用一个dma控制器,占用较多的内存,可能也会占用较多的系统总线,所以此种发脉冲的方式,不能完成控制太多的轴,估计3-4最多了,否者dma控制器、内存等都很紧张。

当然最好还是采用fpag来做发脉冲的事情了。

dma设置代码

  DMA_DeInit(DMA1_Channel2);

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM1_ARP_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 1000;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机的多路AD切换程序设计