一、 XY2—100协议如下
该协议时钟(SENDCK)为2MHz ,SYNC为同步信号,CHANNELX/Y 是数据信号,它有20位组成,其中C2、C1、C0是振镜运动方向值,参考值为001,D15—D0是数据位,它是16位的二进制数,用来控制振镜转过的角度大小(取值为0~65535,即将振镜轴的转动角度范围映射到0~65535);最后一位是偶校验位,当发送的数 据中有偶数个“1”时,对应的校验位为“0”。当发送的数据中有奇数个“1”时对应的校验位为“1”。
二、STM32F103实现
本实现设置系统时钟为72MHz, Keil代码优化等级为O3,使用寄存器开发方式,函数实现如下:
u16 Send_xy_100(u16 x,u16 y)
{
u32 sync=0x003ffff8;
u32 xsend=0x00010000;
u32 ysend=0x00010000;
u32 temp=0x00000008;
u16 i,xcount=0,ycount=0;
xsend|=x;
xsend<<=3;
ysend|=y;
ysend<<=3;
for(i=0;i<16;i++)
{
if(x&0x0001){xcount++;}
if(y&0x0001){ycount++;}
x>>=1;
y>>=1;
}
if(xcount%2==1){xsend|=1<<2;}
if(ycount%2==1){ysend|=1<<2;}
temp=(sync&0x00400000)>>20|(xsend&0x00400000)>>21|(ysend&0x00400000)>>22;
for(i=0;i<22;i++)
{
temp|=0x00000008;
GPIOB->ODR =(GPIOB->ODR&0xfffffff8)|temp;//信号输出
sync<<=1;
xsend<<=1;
ysend<<=1;
temp=(sync&0x00400000)>>20|(xsend&0x00400000)>>21|(ysend&0x00400000)>>22;
GPIOB->ODR&=0xfffffff7;//时钟拉低
ycount=xcount<<10|0x0001<<5;
ycount=xcount+0x0002;
ycount<<=5;
}
return ycount;
}
u16 x为x轴偏转数据(0~65535),u16 y为y轴偏转数据(0~65535)函数返回值无意义只是为了凑出协议2MHz的时序,程序使用IO口进行模拟输出,PB3管脚作为时钟(SENDCK),PB2管脚SYNC为同步信号,PB1管脚CHANNELX,PB0管脚CHANNELY,PB3有默认复用功能,先关闭该复用功能(代码如下),同时记得配置GPIOB的这四个管脚为推挽输出
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->MAPR|=0X00000002<<24;//关闭JTAG-DP,启用SW-DP,或者AFIO->MAPR|=0X00000004<<24;关闭JTAG-DP,关闭SW-DP
三、模拟结果
PB3输出时钟波形
PB2(SYNC,上)与PB0(CHANNELY,下)输出波形(y数据为0x5554)
文章来源:https://www.toymoban.com/news/detail-577875.html
然后作者使用AM26LS31四通道单端转差分芯片,将四路信号转为差分信号,能很好的控制二轴数字振镜。文章来源地址https://www.toymoban.com/news/detail-577875.html
到了这里,关于STM32F103实现数字振镜XY2-100协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!