金牌会员
- 积分
- 1349
- 金钱
- 1349
- 注册时间
- 2018-10-4
- 在线时间
- 200 小时
|
本帖最后由 潘长青 于 2020-6-26 16:57 编辑
关键源码
char GvnWholeData_x[20]={0,0,1};//振镜完整数据x轴(数据头默认001)
char GvnWholeData_y[20]={0,0,1};//振镜完整数据y轴(数据头默认001)
char GvnDataEVEN_x=1; //振镜偶校验(数据头有1个1)
char GvnDataEVEN_y=1; //振镜偶校验(数据头有1个1)
u16 GvnData_x,GvnData_y;
char i=0,j=0,k=1;
u16 m=0;
/****************************************************
定时器2中断服务函数
功能:产生XY2-100协议以及帧头与偶校验的运算
****************************************************/
void TIM2_IRQHandler(void)
{
u8 r = 0;
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //溢出中断
{
if( k==1 )//每40次更新一次
{
k=0;
GvnData_x = GvnBuff[m];
GvnData_y = GvnBuff[m+1];
for( r=0;r<16;r++ )//前三个元素固定001不变
{
GvnWholeData_x[3+r] = (((short)GvnData_x&0x8000)==0x8000)?1:0;//求出目前最高位是0还是1
GvnDataEVEN_x += GvnWholeData_x[3+r]==1?1:0;//记录1的个数,原本就有一个
GvnWholeData_y[3+r] = (((short)GvnData_y&0x8000)==0x8000)?1:0;//求出目前最高位是0还是1
GvnDataEVEN_y += GvnWholeData_y[3+r]==1?1:0;//记录1的个数,原本就有一个
GvnData_x <<= 1;//移掉算过的最高位
GvnData_y <<= 1;//移掉算过的最高位
}
GvnWholeData_x[19] = GvnDataEVEN_x%2==0?0:1;//算最后1位偶校验位
GvnWholeData_y[19] = GvnDataEVEN_y%2==0?0:1;//算最后1位偶校验位
}
else
{
if( i%2==0 && i<40 )//i为偶数时,CLK拉高,XD,YD输出有效电平(0~38中的偶数进入)
{
CLK = 1;
XD = GvnWholeData_x[j];
YD = GvnWholeData_y[j];
SYNC = (i==38?0:1);//i等于38,39时,SYNC拉低,其余为高
j++;
}
else CLK = 0;//i为奇数,CLK拉低
i++; //i=39后,加1等于40,等待1次,再加1变为41才可以拉低所有引脚
if( i==41 ) //一组振镜数据扫描结束(40进入)
{
j = i = 0;
k = 1; //开启更新下一组振镜数据
GvnDataEVEN_x=GvnDataEVEN_y=1;
CLK=SYNC=XD=YD=0;//保证过渡期间波形拉低
if( m == 2*(PointSet-1) )//2*PointSet-2//PointSet是点对数
{
m = 0;
SingleScanFinish_flag = 1;//表示单次扫描完成
Finish_Gvn_Scan();
}
else m+=2;
}
}
}
TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中断标志位
}
示波器测试
欢迎大家来交流讨论!
|
|