抽象,因为一个
__HAL 少写一个短横线,查了半天的错误,抽象。
紧接着,我在串口中断里面,去获取当前的角度,其实,这一步就相当于是定时器的作用,
然后我发现一个现象,就是我的下位机好像不进入中断了,我一开始一位是我的 RX 和 TX 口接错了,结果查了半天,发现不是这个错误。
然后我先去获取上位机的数据,因为我点击执行机构在执行前会先进行判断,判断这个包是不是传的有问题
也就是我代码中的这一行。
if(Rx_data[0]==0x7F&&Rx_data[1]==0x01&&Rx_data[24]==0x77) {
在这一步,我先判断帧头和帧尾,还有命令行,如果这三个数据帧,没有发生改变,我再进一步进行判断。
下一步就是用到了 CRC 校验
我首先在上位机,也就是岸上,去计算一个 CRC 值,因为我规定的是 uint16, 也就是 16 位的,所以我需要拆成两个八位的进行传输。
也就是 Rx_data [23] 和 RX_data [22]
这里 RX_data [23] 是高位
紧接着,我再计算下位机,也就是水下部分,前 21 项,也就是数组下标 0~20,因为上位机也计算了 21 位,所以下位机也计算 21 位,
如果 CRC 校验完的数字再一样,那么我们就可以确定这个数据包是没有错误的。
crc_shou = CRC16(Rx_data,21,0xffff);
crc_fa = (Rx_data[23]<<8) |Rx_data[22];//
也就是下面的部分:
if(crc_shou==crc_fa){
// MPU6050_DMP_Get_Data(&pitch,&roll,&yaw);
err_pitch = target_pitch - pitch;
err_roll =target_roll - roll;
pwm_balance_pitch+=pid_update(err_pitch);
pwm_balance_roll +=pid_update(err_roll);
AixAngf1= (-0.927)*((float) ((AixAng1+5)/10)-181.0);//是经过处理之后的数据,AixAngf1的现象为前后可转动90度,所以AixAngf1的数值为-90~90度
AixAngf2= ((float) ((AixAng2+5)/10)-185.0)*0.9375;
AixAngf3 = ((float) ((AixAng3+5)/10)-182.0)*(-0.9375)+180;
adc1_error = motor_adc1 - 2089;//得知当前adc1的差值
motor_pwm1 = 1500 + adc1_error*0.25;
adc2_error = motor_adc2 - 2063;
motor_pwm2 = 1500 + adc2_error*0.25;
adc3_error = motor_adc3 - 2048;
motor_pwm3 = 1500 + adc3_error*0.25;
adc4_error = motor_adc4 - 2065;//控制左转和右转
motor_pwm4 = 1500 + adc4_error*0.25;
pwm1 = (1500 - motor_pwm1*0.5 +motor_pwm2*0.5)/3*2+(3000-motor_pwm4)/3;
if(pwm1>2000) pwm1=2000;
if(pwm1<1000) pwm1=1000;
pwm2 = (3000 - (motor_pwm1*0.5)-(motor_pwm2*0.5))/3*2+motor_pwm4/3;
if(pwm2>2000) pwm2=2000;
if(pwm2<1000) pwm2=1000;
pwm3 = (motor_pwm1*0.5 +motor_pwm2*0.5)/3*2 + (motor_pwm4)/3;
if(pwm3>2000) pwm3=2000;
if(pwm3<1000) pwm3=1000;
pwm4=(1500 + motor_pwm1*0.5 - motor_pwm2*0.5)/3*2+(3000 - motor_pwm4)/3;
if(pwm4>2000) pwm4=2000;
if(pwm4<1000) pwm4=1000;
pwm5=3000 - motor_pwm3;
pwm6=3000 - motor_pwm3;
//mpu6050调节部分
pwm5 = pwm5+pwm_balance_pitch+pwm_balance_roll;
pwm6 = pwm6+pwm_balance_pitch-pwm_balance_roll;
if(pwm5>2000) pwm5=2000;
if(pwm5<1000) pwm5=1000;
if(pwm6>2000) pwm6=2000;
if(pwm6<1000) pwm6=1000;
angle_pwm4 = 1500 + 10*open_angle;//PA6
// __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, angle_pwm4);
angle_pwm3 = 1150 + 7.22*AixAngf1;
// __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, angle_pwm3);
angle_pwm2 = 1200 +600/90*AixAngf2;
// __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, angle_pwm2);
angle_pwm1 = 1500 +650/90*AixAngf3;
// __HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, angle_pwm1);
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1, pwm1 );
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_2, pwm2 );
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_3, pwm3 );
__HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_4, pwm4 );
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, pwm5);
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, pwm6);
// //控制舵机的
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, angle_pwm4);
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_2, angle_pwm3);
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_3, angle_pwm2);
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_4, angle_pwm1);
但是,想法是这样,实际上却不太一样,我从下位机单纯获取数据,获取
回到一开始说的部分,我在测试数据传输的时候,发现下位机好像进入不了中断,
我说卧槽,这是为什么,然后我单独拿串口去读数据,发现,485 传过来的数据,传到下位机的第二位是 0xC1, 可是我给上位机设定的是 0x01 呀,然后我初步判断是 485 的问题,让数据在传输的过程中发生了改变。
然后我又去单独测上位机,我去判断数据包,发现上位机发下来的就是 0xc1, 诶呦卧槽了,我给的可是 0x01
然后我又测了好几遍,都是这个样子,然后,就刚才,当我听着逃跑计划的歌,去测得时候,md,又好使了,上位机发得数据,又能变成 0x01 了,诶呦我勒个大雷,我不知道为啥又能改了?可能是我原来复位键摁得有问题,maybe。
2024.6.4 调试日志:
控制盒,主手的供电,必须采取 stlink 供电,如果直接采用稳压供电,会不稳,我也不知道为什么。很抽象。
2024.6.5 调试日志:
目前,已经把机器的推进器部分大概调整好了,然后需要记住,串口线的颜色,橙色的接蓝色,黄色的接绿色。
然后,我现在画的板子,有时候上电,板子上面的单片机的电源会不导通,测稳压模块两端的电压,发现其是不导通的。
2024.6.6 日调试日志:
现在单片机的下位机感觉时间一长,串口还是容易卡死在中断里面。