新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于STM32的PCL6045B开发体会

基于STM32的PCL6045B开发体会

作者: 时间:2016-12-01 来源:网络 收藏

于是我猜想是不是我写入的数据不能改变高16位,只能改变低16位.
所以我就做了以下测试工作:
现在发现向DSP各轴缓冲区写入数据时,总是不能写进去高16位,而低十六位能写进去。比如,我写p645_wreg(AXS_AX,WRENV1,0x00000001); //控制脉冲类型。
p645_wreg(AXS_AX,WRENV1,0x00000002);
p645_wreg(AXS_AX,WRENV1,0x00000003);
分别能看到输出不同类型的脉冲。证明低位操作有效!
但是当我写做定长测试时,代码如下
p645_wreg(AXS_AZ, WPRMD, 0x00000041); //定长运动模式
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时我读取出COUNT1中数据也是没有规律的。而不超过65535时,则完全正常!
1.当写入65535时,电机运转过程读出数据如下:
Counter1 Counter2
指令 编码器(这里是默认的1倍,跟我们的编码器对应上是对的)
0000019662 0000000958
0000039790 0000001937
0000059918 0000002917
0000065535 0000003191
0000065535 0000003191
0000065535 0000003191
0000065535 0000003191
2.当写入65536及以上时,电机运转过程读出数据如下:
Counter1 Counter2
指令编码器(这里是默认的1倍,跟我们的编码器对应上是对的)
0000019662 0000000958
0000039790 0000001937
0000059917 0000002917
0000014509 0000003898
0000034637 0000004878
0000054764 0000005857
0000009356 0000006837
0000029484 0000007818
0000049611 0000008797
0000004203 0000009776
0000044458 0000011737
0000064586 0000012718
0000019177 0000013697
0000039305 0000014676
0000059433 0000015657
0000034152 0000017617
0000054279 0000018596
0000008871 0000019577
0000028999 0000020557
0000049126 0000021536
0000003718 0000022516
0000023846 0000023497
0000043973 0000024476
0000018692 0000026436
0000058948 0000028397
0000013539 0000029375
0000033667 0000030355
0000053794 0000031335
以上数据均不超过65535
基于上述现象,我做了个程序来测试 读写,发现,我写入的数据到缓冲去时超过0x00ffffff时,读出来的数据是不对的,只有低24位能读出来,高8位读出来的均是0.
写寄存器函数修改如下:
void p645_wreg(unsigned int base_addr,unsigned int rwcom,unsigned intdata)
{
unionudata{
unsigned int ldata;
unsigned short idata[2];
}udt;
udt.ldata = data;
outpw (base_addr 2, udt. idata[0]);
outpw (base_addr 3, udt. idata[1]);
//outpw (base_addr, rwcom);
}
测试代码如下:
p645_wreg(AXS_AZ,WRENV2,0xffffffff);
data3=inpw (AXS_AZ 2);
data4=inpw (AXS_AZ 3);
读出的数据只能是data3=65535;data4=255,即最高8位丢失!
当p645_wreg(,,); 写入的数据是低0x00ffffff以下的数据时,data3;data4读出来的数据是对的。即写什么读出什么。这就是对我现在遇到的问题的详细叙述。

本文引用地址:https://www.eepw.com.cn/article/201612/324398.htm

后来经过一番折腾,经过大量的测量观察发现。是高16位中的高低字节顺序被对调了。郁闷了。于是我与日本方便的工程师交流,他们让将STM32的A1~A4与PCL6045的A1~A4相连,(原来是STM32的A0~A3与PCL6045的A1~A4)
于是地址也更改为
#define AXS_AX 0x90000000
#define AXS_AY 0x90000008
#define AXS_AZ 0x90000010
#define AXS_AU 0x90000018
我感觉很奇怪。地址线的不同应该只是地址的不一样而已,怎么会导致高两个字节的高低8位对调呢。日本方面说是他们的芯片内部设计是那样的,而我在日脉手册上没有看到任何说明。
之后进一步研究,我的PCL6045控制自如,全部功能顺利验证了一遍。
以上就是我开发PCL6045B过程中的开发体会。转载请注明出处,有问题欢迎交流。


上一页 1 2 下一页

评论


技术专区

关闭