【开源获奖案例】基于T5L智能屏的零食机

描述

——来自迪文开发者论坛

本期为大家推送迪文开发者论坛获奖开源案例——基于T5L智能屏的零食机。该方案基于T5L芯片,通过PWM接口实现实时调控爪子抓取力度、速度,并支持后台按键长按时间读取,各模块自检,报错提醒,同步显示用户投币次数、游戏倒计时等功能,支持投币比例、游戏模式、多语言界面、抓力阈值等参数设置。


  GUI工程设计   
 智能屏幕
  C51工程设计   
 
(1)T5L智能屏和主控的通信代码:   

  •  
  •  

void uart2_master_isr()        interrupt 4{    u8 res;    if(RI0)    {        RI0 = 0;        res = SBUF0;        uart2_rx_timeout = UART2_RX_TIMEOUT;        if((uart2_rx_sta&UART2_PACKET_OK)==0)        {            if(step==0)            {                recv_len = 0;                if(res==0x15)                step = 1;            }            else if(step==1)            {                date_len = res;                step  = 2;                if(date_len>UART2_PACKET_MAX_LEN)                step = 0;            }            else if(step==2)            {                if(recv_len==date_len)                {                    step = 0;                    if(res==0x16)                    {                        uart2_rx_sta = date_len;                        uart2_rx_sta |= UART2_PACKET_OK;                    }                }                else                    uart2_buf[recv_len++] = res;            }        }    }}

(2)电机的驱动代码:

  •  

void motor_move(MOTOR motor,MOTOR_DIR dir){    if(motor==MOTOR_Z)//Z轴上的爪子电机    {        if(dir==MOTOR_DIR_NONE)//停止        {            MOTOR_Z_DISABLE();        }        else        {            if((IS_MOTOR_Z_BACKWARD_POS()&&(dir==MOTOR_DIR_BACKWARD))||              (IS_MOTOR_Z_FORWARD_POS()&&(dir==MOTOR_DIR_FORWARD)))            {                MOTOR_Z_DISABLE();                dir = MOTOR_DIR_NONE;            }            else            {                MOTOR_Z_ENABLE();                MOTOR_Z_DIR_PIN = (dir==MOTOR_DIR_BACKWARD);            }        }    }    else if(motor==MOTOR_X)//X轴移动电机    {        if(dir==MOTOR_DIR_NONE)//停止        {            MOTOR_X_DISABLE();        }        else        {            if(IS_MOTOR_X_BACKWARD_POS()&&(dir==MOTOR_DIR_BACKWARD))            {                MOTOR_X_DISABLE();                dir = MOTOR_DIR_NONE;            }            else            {                MOTOR_X_ENABLE();                MOTOR_X_DIR_PIN = (dir==MOTOR_DIR_BACKWARD);            }        }        x_last_dir = dir;    }    else if(motor==MOTOR_Y)//Y轴移动电机    {        if(dir==MOTOR_DIR_NONE)//停止        {            MOTOR_Y_DISABLE();        }        else        {            if((IS_MOTOR_Y_BACKWARD_POS()&&(dir==MOTOR_DIR_BACKWARD))||                (IS_MOTOR_Y_FORWARD_POS()&&(dir==MOTOR_DIR_FORWARD)))            {                MOTOR_Y_DISABLE();                dir = MOTOR_DIR_NONE;            }            else            {                MOTOR_Y_ENABLE();                MOTOR_Y_DIR_PIN = (dir==MOTOR_DIR_BACKWARD);            }        }        y_last_dir = dir;    }    else if(motor==MOTOR_CLAW)    {        if(dir==MOTOR_DIR_NONE)        {            MOTOR_CLAW_RELEASE();        }        else        {            MOTOR_CLAW_HOLD();        }    }}

(3)通过PWM调节爪子力度,速度的代码:

 

 

  •  

const u16 MOTOR_DUTY[MOTOR_TOTAL][MOTOR_SPEED_MAX+1] = {    {45+DUTY_OFFSET,60+DUTY_OFFSET,80+DUTY_OFFSET,110+DUTY_OFFSET,130+DUTY_OFFSET,160+DUTY_OFFSET,200+DUTY_OFFSET,250+DUTY_OFFSET,550+DUTY_OFFSET,TIM_ARR},//X    {45+DUTY_OFFSET,60+DUTY_OFFSET,80+DUTY_OFFSET,110+DUTY_OFFSET,130+DUTY_OFFSET,160+DUTY_OFFSET,200+DUTY_OFFSET,250+DUTY_OFFSET,550+DUTY_OFFSET,TIM_ARR},//Y    {45,60,80,110,130,160,200,250,550,TIM_ARR},//Z    {200,220,240,270,290,320,360,410,550,TIM_ARR}//爪子  };void motor_set_speed(MOTOR motor,u8 speed){    if(speed>MOTOR_SPEED_MAX)    return;    pwm_set_duty((PWM_CH)motor,MOTOR_DUTY[motor][speed]);}void motor_set_claw_strength_by_vol(float vol){    #define CLAW_DUTY_MIN                        200    #define CLAW_DUTY_MAX                        TIM_ARR    u16 duty;    vol = (float)(vol-QZLDY_MIN)/(QZLDY_MAX-QZLDY_MIN);    if(vol<0)    vol = 0;    else if(vol>1)    vol = 1;    duty = (u16)(vol*(CLAW_DUTY_MAX-CLAW_DUTY_MIN)+0.5f)+CLAW_DUTY_MIN;    pwm_set_duty(PWM_CH_MOTOR_CLAW, duty);}

(4)厂家后台按键长按检测:

  •  
  •  

u8 key_check_long_press(KEY key,u32 time){    while(1)    {        if(!(KEY_Scan(1)&key))        return 1;//失败        if(time)        {            sys_delay_ms(1);            time--;            if(time==0)            return 0;//成功        }    }}

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分