报错内容
报错原因一
使用了一些需要给定时器分配内存的函数,比如在OLED上写字等。
解决方法
在这里推荐大家使用标志位编写回调函数,举例:
def mainTimer_cb(cb):
'''
函数功能:main函数的定时器中断函数,用于总体程序逻辑的定时执行
修改:修改对应的程序时间,以及程序的功能标志位(flag)
'''
global count, reset_flag, ps2_flag, enc_flag, pid_flag, toggle_flag, display_flag, serial_flag, accel_flag
LED(3).toggle()
count += 1
if (count%1000) == 0: # 重置计数 1s
reset_flag = True
if (count%5) == 0: # 获取PS2手柄的值 5ms
ps2_flag = True
if (count%10) == 0: # pid刷新并控制电机 10ms
pid_flag = True
if (count%40) == 0: # oled刷新 40ms
display_flag = True
if (count%15) == 0: # 刷新mpu6050 10ms
accel_flag = True
if (count%30) == 0: # 读取串口信息 30ms
serial_flag =True
if (count%500) == 0: # LED闪烁 500ms
toggle_flag = True
定时器会定时执行回调函数将标志位置位,只需在while
中将标志位置位后对应的执行动作写出即可,举例:
#-----------------------逻辑循环--------------------------#
while True:
# 重置计数器 1s
if reset_flag == True:
count = 0
reset_flag = False
# 读取PS2手柄 5ms
if ps2_flag == True:
ps_info = "ON" if (ps.ps2_key() == 0 and ps2.data[1] == 185) else "OFF"
if ps_info == "ON":
target_pwm_A, target_pwm_B = ps2_control(motor, ps)
else:
target_pwm_A, target_pwm_B = 0, 0
ps2_flag = False
# pid刷新并控制电机 10ms
if pid_flag == True:
speed_A = enc.get_speed_A()
speed_B = enc.get_speed_B()
enc_A = enc.encoder_A
enc_B = enc.encoder_B
# print("encoder_A:", enc_A, "encoder_B:", enc_B)
pwm_A = pid.incremental_pid(enc_A, target_pwm_A)
pwm_B = pid.incremental_pid(enc_B, target_pwm_B)
motor.motor_run(pwm_A, pwm_B, init_angle)
pid_flag = False
# mpu6050
if accel_flag == True:
accel_dict = accel.processed_values()
accel_tuple = (accel_dict["AcX"], accel_dict["AcY"], accel_dict["AcZ"], accel_dict["GyX"], accel_dict["GyY"], accel_dict["GyZ"])
accel_flag = False
# print(accel_tuple)
# UART串口通信 30ms
if serial_flag == True:
zip_data = ser.format_data(encoders=(enc_A, enc_B), imu=accel_tuple)
ser.send_data(zip_data)
rec_data = ser.rev_data()
port_info = "OFF" if (ser.serial_check(rec_data) == False) else "ON" # 判断串口是否接收到数据
serial_flag = False
# USB串口通信,便于调参
print(str(((enc_A, enc_B), accel_tuple)) + "\n")
# oled刷新 40ms
if display_flag == True:
enc.encoder_B = 0; speed_B = 0; #临时测试量
oled_display(ps_info, port_info, accel_tuple, (enc_A, enc_B), (speed_A, speed_B))
display_flag = False
# LED闪烁 500ms
if toggle_flag == True:
LED(2).toggle()
toggle_flag = False
报错原因二
因为在定义回调函数时,必须要给回调函数一个无意义的输入值!否则就会报错
解决方法
回调函数正确定义方式:
- 此处的t无意义,在此打印一下,内容为定时器具体信息。
以下为print(t)
的结果: