Micropython——使用定时器中断报错: uncaught exception in Timer(X) interrupt handler

报错内容

在这里插入图片描述

报错原因一

使用了一些需要给定时器分配内存的函数,比如在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)的结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值