抽象,因为一个

__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 日调试日志:

现在单片机的下位机感觉时间一长,串口还是容易卡死在中断里面。

更新于

请我喝[茶]~( ̄▽ ̄)~*

bangdexuanyuan 微信支付

微信支付