基于STM32PCL6045B开发体会_第1页
基于STM32PCL6045B开发体会_第2页
基于STM32PCL6045B开发体会_第3页
基于STM32PCL6045B开发体会_第4页
基于STM32PCL6045B开发体会_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于STM32的PCL6045B开发领悟基于STM32的PCL6045B开发领悟12/12基于STM32的PCL6045B开发领悟基于STM32的PCL6045B开发领悟基于STM32的PCL6045B开发领悟上两个月做了个关于尿残渣的新项目,用到了电机驱动芯片PCL6045BL。这个系统方案有一个20余年工作经验的老工程师提出来,主要采用的是STM32操作PCL6045,进而控制多轴电机运动。于是公司从每个不一样项目组抽选人员组成了一个团队。自己负责软件部分,负责编写驱动程序和调试电路板。崭新项目,有必然挑战性。经过解析,决定采用STM32总线方式(FSMC)驱动PCL6045B。比较FSM

2、C的四种总线操作时序和PCL6045B操作时序。认为应该采用STM32的PCCARD模式操作。从数据库中查找了一些文件资料,就开干起来了。两名硬件工程师按我的需求设计好硬件电路板。接下来分成以下几个步骤进行:第一就是建立通讯。让ARM能跟PCL6045B建立起来通讯。这一步主要就是配置STM32的FSMC为PCCARD模式,配置的过程就是按官方手册上配置的。先系统初始化配置好STM32的时钟(不赘述)。尔后就是初始化端口,这里需要注意的是,要将跟FSMC相关的端口都设置为特别功能口AF。以下:voidPCCARD_IO_Init(void)GPIO_InitTypeDefGPIO_InitSt

3、ructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIODRCC_APB2Periph_GPIOERCC_APB2Periph_GPIOFRCC_APB2Periph_GPIOG,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1GPIO_Pin_2GPIO_Pin_3GPIO_Pin_4GPIO_Pin_12GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_P

4、P;GPIO_Init(GPIOF,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7GPIO_Pin_8GPIO_Pin_9GPIO_Pin_10GPIO_Pin_11GPIO_Pin_12GPIO_Pin_13GPIO_Pin_14GPIO_Pin_15;GPIO_Init(GPIOE,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14GPIO_Pin_15GPIO_Pin_10GPIO_Pin_9GPIO_Pin_8GPIO_Pin_1GPIO_Pin

5、_0;GPIO_Init(GPIOD,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4GPIO_Pin_5;/NOE,NWE引脚GPIO_Init(GPIOD,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;/csGPIO_Init(GPIOG,&GPIO_InitStructure);接下来就是配置FSMCPC卡模式时序。以下:voidPCCARD_Init(void)FSMC_PCCARDInitTypeDefFSMC_PCCARDInitStru

6、cture;FSMC_NAND_PCCARDTimingInitTypeDefp;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);/p.FSMC_SetupTime=0 x02;p.FSMC_WaitSetupTime=0 x04;p.FSMC_HoldSetupTime=0 x02;p.FSMC_HiZSetupTime=0 x03;FSMC_PCCARDInitStructure.FSMC_Waitfeature=FSMC_Waitfeature_Enable;/使能等待FSMC_PCCARDInitStructure.FSMC_TCLRS

7、etupTime=0 x10;FSMC_PCCARDInitStructure.FSMC_TARSetupTime=0 x10;FSMC_PCCARDInitStructure.FSMC_CommonSpaceTimingStruct=&p;FSMC_PCCARDInitStructure.FSMC_AttributeSpaceTimingStruct=&p;FSMC_PCCARDInitStructure.FSMC_IOSpaceTimingStruct=&p;FSMC_PCCARDInit(&FSMC_PCCARDInitStructure);FSMC_PCCARDCmd(ENABLE);

8、到这里,就算配置完成。主函数调用。尔后主函数经过控制PCL6045的其中一个口实验成功,于是就算建立起了通讯。接下来就可以试验控制PCL6045参数指定数目的脉冲了。于是,我依照手册又编写了以下小测试程序:p645_wreg(AXS_AU,WPRMD,0 x00000041);/定长运动模式p645_wreg(AXS_AU,WRMV,4012000000);p645_wreg(AXS_AU,WRFL,500L);p645_wreg(AXS_AU,WRFH,20000L);p645_wreg(AXS_AU,WRUR,200L);p645_wreg(AXS_AU,WRDR,400L);p645_w

9、reg(AXS_AU,WRMG,29L);p645_wcom(AXS_AU,STAUD);运转,成功产生脉冲!正常过程很简单,但是,实质操作中,特别是第一次探究的时候,遇到很多棘手的问题。比方PCL6045硬件部分IF0IF1要接成8086方式。一开始,我们的硬件电路按以以下图链接:忧如也没什么问题,于是就接着往下调,发现了一个很烦闷的问题,当时把问题描述以下:#defineAXS_AX(volatileunsignedint)0 x90000000)#defineAXS_AY(volatileunsignedint)0 x90000004)#defineAXS_AZ(volatileunsi

10、gnedint)0 x9000008)#defineAXS_AU(volatileunsignedint)0 x900000c)其中AXS_AX、AXS_AY、AXS_AZ、AXS_AU分别表示X、Y、Z、U轴寄存器的初步地址几个地址均已经能够操作,能控制各个轴电机运动。STM32经过FSMC与DSP通讯,经过16位传达数据。#defineoutpw(address,data)(*(unsignedshort*)(address)=(data);unsignedintinpw(unsignedintaddress)/读写某一段内存unsignedshortdata;data=*(unsigne

11、dshort*)address;returndata;写寄存器函数以下:voidp645_wreg(unsignedintbase_addr,unsignedintrwcom,unsignedintdata)/向某个轴的某个寄存器写入数据unionudataunsignedintldata;unsignedshortidata2;udt;udt.ldata=data;outpw(base_addr2,udt.idata0);/Delay_Us(1);/就算加了延时也无效outpw(base_addr3,udt.idata1);/Delay_Us(1);/就算加了延时也无效outpw(base_

12、addr,rwcom);/读寄存器函数以下:unsignedlongp645_rreg(unsignedintbase_addr,unsignedintrrcom)/读寄存器unionudataunsignedintldata;unsignedshortidata2;udt;outpw(base_addr,rrcom);/Delay_Us(1);udt.idata0=inpw(base_addr2);/Delay_Us(1);udt.idata1=inpw(base_addr3);return(udt.ldata);在设置解码倍频时,发现,无论我写入的是哪个数(00,01,10),都不能够改变

13、编码器读出的数据,即向来是默认的1倍解码,即相关寄存器两个bit是00的情况.于是我猜想是不是我写入的数据不能够改变高16位,只能改变低16位.所以我就做了以下测试工作:现在发现向DSP各轴缓冲区写入数据时,总是不能够写进去高16位,而低十六位能写进去。比方,我写p645_wreg(AXS_AX,WRENV1,0 x00000001);/控制脉冲类型。p645_wreg(AXS_AX,WRENV1,0 x00000002);p645_wreg(AXS_AX,WRENV1,0 x00000003);分别能看到输出不一样种类的脉冲。证明低位操作有效!但是当我写做定长测试时,代码以下p645_wre

14、g(AXS_AZ,WPRMD,0 x00000041);/定长运动模式p645_wreg(AXS_AZ,WRMV,65536L);/这里写入65535以下的数均能正确控制电机走的步数,高出65535,则会出现电机连续运动而不受控制的异常情况!p645_wreg(AXS_AZ,WRFL,500L);p645_wreg(AXS_AZ,WRFH,2000L);p645_wreg(AXS_AZ,WRUR,200L);p645_wreg(AXS_AZ,WRDR,400L);p645_wreg(AXS_AZ,WRMG,5L);p645_wcom(AXS_AZ,STAUD);别的,高出65535时我读取出C

15、OUNT1中数据也是没有规律的。而不高出65535时,则完好正常!当写入65535时,电机运转过程读出数据以下:Counter1Counter2指令编码器(这里是默认的1倍,跟我们的编码器对应上是对的)0000039790000000193700000655350000003191000006553500000031910000065535000000319100000655350000003191当写入65536及以上时,电机运转过程读出数据以下:Counter1Counter2指令编码器(这里是默认的1倍,跟我们的编码器对应上是对的)0000039790000000193700000346

16、370000004878000005476400000058570000009356000000683700000294840000007818000000420300000097760000044458000001173700000645860000012718000003930500000146760000059433000001565700000542790000018596000002899900000205570000023846000002349700000439730000024476000005894800000283970000033667000003035500000537

17、940000031335以上数据均不高出65535基于上述现象,我做了个程序来测试读写,发现,我写入的数据到缓冲去时高出0 x00ffffff时,读出来的数据是不对的,只有低24位能读出来,高8位读出来的均是0.写寄存器函数更正以下:voidp645_wreg(unsignedintbase_addr,unsignedintrwcom,unsignedintdata)unionudataunsignedintldata;unsignedshortidata2;udt;udt.ldata=data;outpw(base_addr2,udt.idata0);outpw(base_addr3,udt

18、.idata1);/outpw(base_addr,rwcom);测试代码以下:p645_wreg(AXS_AZ,WRENV2,0 xffffffff);data3=inpw(AXS_AZ2);data4=inpw(AXS_AZ3);读出的数据只能是data3=65535;data4=255,即最高8位扔掉!当p645_wreg(,);写入的数据是低0 x00ffffff以下的数据时,data3;data4读出来的数据是对的。即写什么读出什么。这就是对我现在遇到的问题的详细表达。此后经过一番折腾,经过大量的测量观察发现。是高16位中的高低字节序次被对调了。烦闷了。于是我与日本方便的工程师交流,他们让将STM32的A1A4与PCL6045的A1A4相连,(原来是

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论