考虑到现有板子上没有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;
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/258967.html