打印
[信息]

STM32例程+升降桌控制板

[复制链接]
10568|125
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
升降桌控制板:主要市场为海外市场,1年市场容量在10亿;
目前做的比较好:比如浙江捷昌(上市公司);

产品用途:主要面向久坐的办公一族,可以有效的调整坐姿和站姿,轻松实现坐站交替的健康办公模式。
除此之外它还支持实时显示高度、位置**等功能,更带有遇阻反弹、过载、过压、欠压等保护功能。

控制板主要分:操作器和控制器2大部分;
操作器:主要用由数码管显示,按键,MCU采用STM32F051C8T6;
控制器:主要控制电机的升降,温度,位置检测等,MCU采用STM32F051C8T6;
软件使用平台都是:KEIL MDK;
STM32F051官网链接:http://www.st.com/content/st_com ... x1/stm32f051c8.html

操作器和控制器自己采用:串口通讯的方式进行通讯;下图为操作器
   

下图为控制器





操作器源代码.rar

301.04 KB, 阅读权限: 90

控制器源代码.rar

100.66 KB, 阅读权限: 90

评论
jermery118 2019-6-3 13:32 回复TA
楼主能发我一份吗?1004750281@qq.com 
沙发
mmuuss586|  楼主 | 2017-9-23 17:04 | 只看该作者
操作器部分简易框图:

主要由主控单元;与主控单元输入端连接的电源单元、按键输入单元;与主控单元双向连接的通讯单元;以及与主控单元输出端连接的显示单元。

使用特权

评论回复
板凳
mmuuss586|  楼主 | 2017-9-23 17:06 | 只看该作者
控制器框图如下图所示:

使用特权

评论回复
地板
mmuuss586|  楼主 | 2017-9-23 17:08 | 只看该作者
本帖最后由 mmuuss586 于 2018-2-12 16:36 编辑

控制器主程序部分:


//        IWDG_Open();
        main_cycle_count = SystemTimeTickGet();
        while(1)
        {
//        TIM_SetCompare1(TIM1, (uint16_t)TIM_CCR_VALUE(pwm_on_rite));        //0%
//        TIM_SetCompare1(TIM1, (1.0-pwm_on_rite)*(PWM_T-1));        //
                CommuicationWork();        

        //每2ms处理一次采样数据
        if(1 /* (PastTick(main_cycle_count) % 10 == 0) */)
        {
            ProtectCheckRun();
        }

        Motor1ParamCheckRun();

        MotorControlWorking();


        #if(__TEST_MAIN__)
        main_run_time++;
        //实测通常情况下12us一个循环周期 2016.8.13
        if(main_run_time >= 10000)
        {
            temp_arry[ii++] = PastTick(main_cycle_count);
            main_run_time = 0;
            main_cycle_count = SystemTimeTickGet();
            if(ii >= 100)
            {
                ii = 0;
            }
        }
        #else
        //每500ms喂狗
                if(PastTick(main_cycle_count) >= FEED_IWDG_TIME)
                {
                          IWDG_Feed();
                        main_cycle_count = SystemTimeTickGet();
                         LED_toggle_flag=(FlagStatus)!LED_toggle_flag;
                         LED_ToggleRun1(LED_toggle_flag);
            
            #if(0)
            if(pwm_on_rite < 100)
            {
                pwm_on_rite += 10;
                TIM_SetCompare1(TIM1, (uint16_t)TIM_CCR_VALUE(pwm_on_rite));        
            }
            if(pwm_on_rite == 100)
            {
                pwm_on_rite = 200;
                TIM_SetCompare1(TIM1, (uint16_t)TIM_CCR_VALUE(0));        //0%
            }
            #endif
                 }
        #endif
        }
}

使用特权

评论回复
5
mmuuss586|  楼主 | 2017-9-23 17:10 | 只看该作者
static void USART1_AnswerNormal(u8 cdk_address, u8 cdk_cmd)
{
        uint8_t        count = 0;
    uint8_t send_buf[SEND_NORMAL_PACKAGE_LEN];
       
    send_buf[count++] = CMD_START;
    send_buf[count++] = cdk_address;
    send_buf[count++] = cdk_cmd;
        send_buf[count++] = UART1_SEND_NORMAL_LEN;
        send_buf[count++] = RESERVE_NORMAL_DATA;
    {
        uint16_t crc16_temp = CRC16(&send_buf[DATA_POS],send_buf[DATA_LEN_POS]);
        send_buf[count++] = crc16_temp/256;
        send_buf[count++] = crc16_temp%256;
    }
        send_buf[count] = CMD_END;

        for(count = 0; count < SEND_NORMAL_PACKAGE_LEN; count++)
        {
                USART1->TDR = send_buf[count];
                while(!(USART1->ISR & USART_ISR_TC));//等待发送完
        }
}

使用特权

评论回复
6
mmuuss586|  楼主 | 2017-9-23 17:11 | 只看该作者
电机控制部分:
/*******************************************************************************************
Function Name       : MotorControlWorking

Object              :

Input Parameters    : None
Output Parameters   : None
*******************************************************************************************/
void MotorControlWorking(void)
{
    u16     u16_temp;

    if(!MotorControlExstartReady())
    {
        return;
    }
    if(!MotorControlStopingReady())
    {
        return;
    }

    //运行状态下
    if(pwm_ctl_motor_ctx.grop_flag.move_flag)                              
    {
        MotorWorkForRoundConstCircle();
        GetMotorRunCurrPwmRitio();

        if(pwm_ctl_motor_ctx.grop_flag.add_speed_flag)
        {
            u16_temp = PastTick(pwm_ctl_motor_ctx.add_time_tick);
            if(u16_temp >= pwm_ctl_motor_ctx.add_time_normal)   //加速时间到
            {
                pwm_ctl_motor_ctx.grop_flag.add_speed_flag = 0;
                pwm_ctl_motor_ctx.curr_speed = pwm_ctl_motor_ctx.set_speed;
                pwm_ctl_motor_ctx.add_time_tick = 0;
            }
            else                       //匀加速
            {
                pwm_ctl_motor_ctx.curr_speed = pwm_ctl_motor_ctx.add_start_speed +      \
                (pwm_ctl_motor_ctx.set_speed-pwm_ctl_motor_ctx.add_start_speed)*u16_temp/pwm_ctl_motor_ctx.add_time_normal;
            }
        }
        //减速标志位
        else if(pwm_ctl_motor_ctx.grop_flag.dec_speed_flag)
        {
            u16_temp = PastTick(pwm_ctl_motor_ctx.dec_time_tick);
            if(u16_temp >= DEC_TIME_NORMAL)
            {
                MotorControlStop();
                if(pwm_ctl_motor_ctx.grop_flag.stop_flag)
                {
                    pwm_ctl_motor_ctx.grop_flag.stop_flag = 0;
                    pwm_ctl_motor_ctx.grop_flag.move_flag = 0;
                }
                pwm_ctl_motor_ctx.dec_time_tick = 0;
                pwm_ctl_motor_ctx.grop_flag.dec_speed_flag = 0;
//                pwm_ctl_motor_ctx.grop_flag.add_speed_flag = 1;               //加速标志位
                pwm_ctl_motor_ctx.add_time_tick = 0;                                       //加速计数       
                pwm_ctl_motor_ctx.curr_speed = pwm_ctl_motor_ctx.dec_start_speed;
            }
            else                      //匀减速
            {
                pwm_ctl_motor_ctx.curr_speed = pwm_ctl_motor_ctx.set_speed - (pwm_ctl_motor_ctx.set_speed-pwm_ctl_motor_ctx.dec_start_speed)*u16_temp/DEC_TIME_NORMAL;
            }
        }
        else
        {
        }

        if(pwm_ctl_motor_ctx.curr_speed)
        {
            MotorControlMove(pwm_ctl_motor_ctx.curr_speed);
        }

        //停车检测
        MotorWorkForBrakeCheck();

        MotorWorkForStopJudge();
    }
    else
    {
     //   MotorControlStop();
        
        //保护标志位没有清除之前,不执行任何操作,自学习状态除外
        if(protect_check_grop_flag.u8[0] && !pwm_ctl_motor_ctx.self_learn_status)
        {
            return;
        }

        //以下程序顺序不可颠倒 xxz 2016.8.13
        MotorWorkForSelfLearn();

        MotorWorkForAdjustBaseHigh();

        MotorWorkForMemoryPlace();

        MotorWorkForManualCtl();

        MotorWorkForRecoundProtect();

        if(system_user_normal_data.aa.sys_user_flag.bit.working_mode)
        {
            MotorWorkForFatigueTest();
        }

        MotorControlStoppedFinish();

        GetMotorRoundConstCircle();

        MotorWorkForStartJudge();
    }
}

使用特权

评论回复
7
mmuuss586|  楼主 | 2017-9-23 17:12 | 只看该作者
/*******************************************************************************************
Function Name       : MotorWorkForMemoryPlace

Object              : 电机控制到达**位置

Input Parameters    : None
Output Parameters   : None
*******************************************************************************************/
static void MotorWorkForMemoryPlace(void)
{
    if(uart1_comm_flag.place_called_flag && system_user_normal_data.aa.set_object_high)
    {
        switch(pwm_ctl_motor_ctx.mhc_status)
        {
            case MHC_ZERO:
                if(!pwm_ctl_motor_ctx.grop_flag.move_flag)
                {
                    pwm_ctl_motor_ctx.mhc_status = MHC_START;
                }
                break;
            
            case MHC_START:
                pwm_ctl_motor_ctx.mhc_status = MHC_RUNING;
                pwm_ctl_motor_ctx.adjust_high_dist = abs(system_user_normal_data.aa.set_object_high - system_user_normal_data.aa.curr_real_high);
                if(system_user_normal_data.aa.set_object_high > system_user_normal_data.aa.curr_real_high)
                {
                    pwm_ctl_motor_ctx.grop_flag.move_flag = 1;
                    MotorControlDir(UPWARD);
                }
                else if(system_user_normal_data.aa.set_object_high < system_user_normal_data.aa.curr_real_high)
                {
                    pwm_ctl_motor_ctx.grop_flag.move_flag = 1;
                    MotorControlDir(DOWN);
                }
                else
                {
                    pwm_ctl_motor_ctx.mhc_status = MHC_FINISH;
                }
                break;

            case MHC_RUNING:
                if(!pwm_ctl_motor_ctx.grop_flag.move_flag)
                {
                    pwm_ctl_motor_ctx.mhc_status = MHC_FINISH;
                }
                break;
            
            case MHC_FINISH:
                uart1_comm_flag.place_called_flag = 0;
                pwm_ctl_motor_ctx.mhc_status = MHC_ZERO;
                pwm_ctl_motor_ctx.adjust_high_dist = 0;
                break;

            default:
                break;
        }
    }
}

/*******************************************************************************************
Function Name       : MotorWorkForManualCtl

Object              : 电机手动控制

Input Parameters    : None
Output Parameters   : None
*******************************************************************************************/
static void MotorWorkForManualCtl(void)
{
    if(uart1_comm_flag.manual_mode_ctl_upward)
    {
        if(!pwm_ctl_motor_ctx.grop_flag.move_flag)
        {
            pwm_ctl_motor_ctx.grop_flag.move_flag = 1;
            MotorControlDir(UPWARD);
        }
    }
    else if(uart1_comm_flag.manual_mode_ctl_down)
    {
        if(!pwm_ctl_motor_ctx.grop_flag.move_flag)
        {
            pwm_ctl_motor_ctx.grop_flag.move_flag = 1;
            MotorControlDir(DOWN);
        }
    }
}

/*******************************************************************************************
Function Name       : MotorWorkForRecoundProtect

Object              : 反弹保护操作

Input Parameters    : None
Output Parameters   : None
*******************************************************************************************/
static void MotorWorkForRecoundProtect(void)
{
    if(protect_check_grop_flag.bit.recound_power_flag)
    {
        if(pwm_ctl_motor_ctx.grop_flag.motor_last_status == UPWARD)
        {
            if(!pwm_ctl_motor_ctx.grop_flag.move_flag)
            {
                pwm_ctl_motor_ctx.grop_flag.move_flag = 1;
                MotorControlDir(DOWN);
            }
        }
        else if(pwm_ctl_motor_ctx.grop_flag.motor_last_status == DOWN)
        {
            if(!pwm_ctl_motor_ctx.grop_flag.move_flag)
            {
                pwm_ctl_motor_ctx.grop_flag.move_flag = 1;
                MotorControlDir(UPWARD);
            }
        }
    }
}


/*******************************************************************************************
Function Name       : MotorWorkForStartJudge

Object              : 电机启动条件预判

Input Parameters    : None
Output Parameters   : None
*******************************************************************************************/
static void MotorWorkForStartJudge(void)
{
    if(pwm_ctl_motor_ctx.grop_flag.move_flag && \
      !pwm_ctl_motor_ctx.grop_flag.stop_flag && \
      !pwm_ctl_motor_ctx.grop_flag.add_speed_flag &&    \
      (pwm_ctl_motor_ctx.grop_flag.motor_curr_status != STOP))
    {
        pwm_ctl_motor_ctx.grop_flag.move_enable_flag = 1;
        pwm_ctl_motor_ctx.grop_flag.add_speed_flag = 1;
        pwm_ctl_motor_ctx.grop_flag.dec_speed_flag = 0;
        pwm_ctl_motor_ctx.add_time_tick = SystemTimeTickGet();   
    }
}

/*******************************************************************************************
Function Name       : MotorWorkForStopJudge

Object              : 电机停止条件预判

Input Parameters    : None
Output Parameters   : None
*******************************************************************************************/
static void MotorWorkForStopJudge(void)
{
    if(pwm_ctl_motor_ctx.grop_flag.stop_flag && \
      !pwm_ctl_motor_ctx.grop_flag.dec_speed_flag &&   \
      (pwm_ctl_motor_ctx.grop_flag.motor_curr_status != STOP))
    {
        pwm_ctl_motor_ctx.grop_flag.add_speed_flag = 0;
        pwm_ctl_motor_ctx.grop_flag.dec_speed_flag = 1;
        pwm_ctl_motor_ctx.dec_time_tick = SystemTimeTickGet();
    }
}


/*******************************************************************************************
Function Name       : MotorWorkForBrakeCheck

Object              : 电机刹车停止检测

Input Parameters    : None
Output Parameters   : None
*******************************************************************************************/
static void MotorWorkForBrakeCheck(void)
{
    //没有车速,目标到达,或者立即停车标志有效,直接停止
    if(!pwm_ctl_motor_ctx.curr_speed ||     \
        pwm_ctl_motor_ctx.grop_flag.now_stop_flag ||    \
        protect_check_grop_flag.bit.motor1_top_flag ||  \
        protect_check_grop_flag.bit.motor1_bottom_flag ||   \
        protect_check_grop_flag.u8[0])
    {
        MotorControlStop();

        pwm_ctl_motor_ctx.grop_flag.move_flag = 0;
        pwm_ctl_motor_ctx.grop_flag.add_speed_flag = 0;
        pwm_ctl_motor_ctx.add_time_tick = 0;
        if(pwm_ctl_motor_ctx.grop_flag.stop_flag)
        {
            pwm_ctl_motor_ctx.grop_flag.stop_flag = 0;
            pwm_ctl_motor_ctx.grop_flag.dec_speed_flag = 0;
            pwm_ctl_motor_ctx.dec_time_tick = 0;
        }
        if(pwm_ctl_motor_ctx.grop_flag.now_stop_flag)
        {
            pwm_ctl_motor_ctx.grop_flag.adjust_round_flag = 0;
            pwm_ctl_motor_ctx.grop_flag.now_stop_flag = 0;
        }
    }

    //电机转速为0,且电流为0,时间到了
    if(!system_user_normal_data.aa.curr_motor1_rpm && !motor_pwm_speed_check.curr_motor1_rpm2 &&   \
       !system_user_normal_data.aa.curr_sample_I1 && !pwm_ctl_motor_ctx.grop_flag.stop_flag)
    {
        if(!pwm_ctl_motor_ctx.motor1_stopped_tick)
        {
            pwm_ctl_motor_ctx.motor1_stopped_tick = SystemTimeTickGet();
        }
        else if(PastTick(pwm_ctl_motor_ctx.motor1_stopped_tick) >= PARAM_CHECK_ZERO_DELAY_MIN)
        {
            MotorControlStop();

            pwm_ctl_motor_ctx.grop_flag.move_flag = 0;
            pwm_ctl_motor_ctx.grop_flag.add_speed_flag = 0;
            pwm_ctl_motor_ctx.add_time_tick = 0;
            pwm_ctl_motor_ctx.motor1_stopped_tick = 0;
        }
        if(pwm_ctl_motor_ctx.motor1_stopped_tick && !pwm_ctl_motor_ctx.grop_flag.move_flag)
        {
            pwm_ctl_motor_ctx.motor1_stopped_tick = 0;
        }
    }
    else
    {
        pwm_ctl_motor_ctx.motor1_stopped_tick = 0;
    }

    //手动停止了或者保护
    if(uart1_comm_flag.manual_mode_ctl_stop_flag)
    {
        pwm_ctl_motor_ctx.grop_flag.stop_flag = 1;
        uart1_comm_flag.manual_mode_ctl_stop_flag = 0;
    }
}

/*******************************************************************************************
Function Name       : GetMotorRoundConstCircle

Object              : 获取电机旋转固定的圈数

Input Parameters    : None
Output Parameters   : None
*******************************************************************************************/
static void GetMotorRoundConstCircle(void)
{
    //到顶、底后反向调整圈数
    if(!system_user_normal_data.aa.set_object_circles && \
      (protect_check_grop_flag.bit.motor1_top_flag || protect_check_grop_flag.bit.motor1_bottom_flag))
    {
        if(protect_check_grop_flag.bit.motor1_top_flag)
        {
            system_user_normal_data.aa.set_object_circles = TO_TOP_OR_BOTTOM_RETERN_NUM;
        }
        //距离取整
        else if(protect_check_grop_flag.bit.motor1_bottom_flag)
        {
            system_user_normal_data.aa.set_object_circles = TO_TOP_OR_BOTTOM_RETERN_NUM;
            if((system_user_normal_data.aa.curr_run_circles_count % TWO_UNIT_CIRCLE_NUM) != 0)
            {
                system_user_normal_data.aa.set_object_circles = system_user_normal_data.aa.curr_run_circles_count % TWO_UNIT_CIRCLE_NUM;
            }
        }
            
        pwm_ctl_motor_ctx.grop_flag.adjust_round_flag = 1;
        protect_check_grop_flag.bit.motor1_top_flag = protect_check_grop_flag.bit.motor1_bottom_flag = 0;
    }
    //反弹保护反向调整圈数
    else if(!system_user_normal_data.aa.set_object_circles && protect_check_grop_flag.bit.recound_power_flag)
    {
        system_user_normal_data.aa.set_object_circles = TWO_UNIT_CIRCLE_NUM - pwm_ctl_motor_ctx.motor1_circle_set;
        pwm_ctl_motor_ctx.grop_flag.adjust_round_flag = 1;
        protect_check_grop_flag.bit.recound_power_flag = 0;
    }
    //其它调整圈数
    else if(!system_user_normal_data.aa.set_object_circles && pwm_ctl_motor_ctx.adjust_high_dist)
    {
        system_user_normal_data.aa.set_object_circles = MOTOR_ROUND_CIRCLE(pwm_ctl_motor_ctx.adjust_high_dist * 10);
        pwm_ctl_motor_ctx.grop_flag.adjust_round_flag = 1;
    }
}

/*******************************************************************************************
Function Name       : MotorWorkForRoundConstCircle

Object              : 电机旋转固定圈数

Input Parameters    : None
Output Parameters   : None
*******************************************************************************************/
static void MotorWorkForRoundConstCircle(void)
{
    u16 rst_temp = 0;

    //调整状态下,缓慢加速
    if(pwm_ctl_motor_ctx.grop_flag.adjust_round_flag)
    {
        pwm_ctl_motor_ctx.add_time_normal = ADD_TIME_NORMAL * ADD_TIME_FACTOR;//ADD_TIME_FACTOR
    }
    else
    {
        pwm_ctl_motor_ctx.add_time_normal = ADD_TIME_NORMAL;
    }

    if(system_user_normal_data.aa.set_object_circles && pwm_ctl_motor_ctx.grop_flag.adjust_round_flag)
    {
        rst_temp = system_user_normal_data.aa.set_object_circles - MOTOR_STOP_CIRCLE_ERR;
        if(system_user_normal_data.aa.curr_circles_this_start >= rst_temp)
        {
            pwm_ctl_motor_ctx.grop_flag.now_stop_flag = 1;
        }
        //双条件保障
        if(pwm_ctl_motor_ctx.mhc_status)
        {
            if(system_user_normal_data.aa.curr_real_high == system_user_normal_data.aa.set_object_high)
            {
                pwm_ctl_motor_ctx.grop_flag.now_stop_flag = 1;
            }
            //修正
            else if(pwm_ctl_motor_ctx.grop_flag.now_stop_flag)
            {
                system_user_normal_data.aa.curr_real_high = system_user_normal_data.aa.set_object_high;
            }
        }
    }
    else
    {
        //距离到达优先级最高
        if(!pwm_ctl_motor_ctx.self_learn_status &&  \
           (system_user_normal_data.aa.curr_real_high == system_user_normal_data.aa.set_base_high))
        {
            //到底后不允许再向下
            if(pwm_ctl_motor_ctx.grop_flag.motor_curr_status == DOWN)
            {
                pwm_ctl_motor_ctx.grop_flag.now_stop_flag = 1;
            }
        }

        if(system_user_normal_data.aa.up_to_down_run_circles && !pwm_ctl_motor_ctx.self_learn_status)
        {
            //到顶后不允许再向上
            if(((system_user_normal_data.aa.curr_run_circles_count >= system_user_normal_data.aa.up_to_down_run_circles) ||  \
                (system_user_normal_data.aa.curr_real_high == system_user_normal_data.aa.self_learn_top_high)) &&  \
                (pwm_ctl_motor_ctx.grop_flag.motor_curr_status == UPWARD))
            {
                pwm_ctl_motor_ctx.grop_flag.now_stop_flag = 1;
                system_user_normal_data.aa.curr_run_circles_count = system_user_normal_data.aa.up_to_down_run_circles;
                system_user_normal_data.aa.curr_real_high = system_user_normal_data.aa.self_learn_top_high;
            }
            //到底后不允许再向下
            else if((!system_user_normal_data.aa.curr_run_circles_count ||      \
                    (system_user_normal_data.aa.curr_real_high == system_user_normal_data.aa.set_base_high)) &&   \
                    (pwm_ctl_motor_ctx.grop_flag.motor_curr_status == DOWN))
            {
                pwm_ctl_motor_ctx.grop_flag.now_stop_flag = 1;
                system_user_normal_data.aa.curr_real_high = system_user_normal_data.aa.set_base_high;
                system_user_normal_data.aa.curr_run_circles_count = 0;
            }
        }
    }
}

使用特权

评论回复
8
dingbo95| | 2017-9-23 20:07 | 只看该作者
楼主这个看上去像个项目啊,工程挺大的。

使用特权

评论回复
9
mmuuss586|  楼主 | 2017-9-23 21:12 | 只看该作者
dingbo95 发表于 2017-9-23 20:07
楼主这个看上去像个项目啊,工程挺大的。

还好吧,标准产品;

使用特权

评论回复
10
昊430| | 2017-9-25 15:42 | 只看该作者
好像买过,看外形一模一样

使用特权

评论回复
11
mmuuss586|  楼主 | 2017-9-25 16:51 | 只看该作者
昊430 发表于 2017-9-25 15:42
好像买过,看外形一模一样

外形都是一样的,一样的壳子

使用特权

评论回复
12
gujiamao12345| | 2017-9-25 18:36 | 只看该作者
这个厉害的!!!

使用特权

评论回复
13
lisasa| | 2017-9-26 09:08 | 只看该作者
资料不错,附件怎么不能下载?

使用特权

评论回复
14
mmuuss586|  楼主 | 2017-9-26 09:21 | 只看该作者
lisasa 发表于 2017-9-26 09:08
资料不错,附件怎么不能下载?

你好像级别不够,设置了权限;
你才355分,好像1000分以上吧;

使用特权

评论回复
15
mmuuss586|  楼主 | 2017-9-26 09:21 | 只看该作者

谢谢支持;

使用特权

评论回复
16
lisasa| | 2017-9-26 09:36 | 只看该作者
级别不够, 哪位好心人能发一份到我邮箱里:panxd@tom.com ,万分感谢。

使用特权

评论回复
17
未知| | 2017-9-26 09:46 | 只看该作者
电机是用什么的?

使用特权

评论回复
18
lisasa| | 2017-9-26 09:53 | 只看该作者
应该是24V有刷电机,带上下限位开关,有可能还带霍尔做转数计数脉冲。

使用特权

评论回复
19
mmuuss586|  楼主 | 2017-9-26 10:42 | 只看该作者
lisasa 发表于 2017-9-26 09:53
应该是24V有刷电机,带上下限位开关,有可能还带霍尔做转数计数脉冲。

是的,不过要复杂些;
电机的话,单电机、双电机、4电机等;

位置的话,除了霍尔,还有算法检测,提高精度等;

使用特权

评论回复
20
mmuuss586|  楼主 | 2017-9-26 10:42 | 只看该作者
未知 发表于 2017-9-26 09:46
电机是用什么的?

有刷减速电机;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

696

主题

32643

帖子

437

粉丝