• 【芯片驱动】SMG42630的固定步数实现


    1. SGM42630电路设计

    2.  产生固定数量PWM

    生成固定数量的PWM个数需要创建这几个函数:

    2.1 SGM23630初始化

    1. int SGM42630_Init(void)
    2. {
    3. NRESET_SGM42630_H(); //1正常模式,0复
    4. SGM42630_StepMotor_Dir_FWD();
    5. SGM42630_StepMotor_MicroStep(8);//8细分模式
    6. STEP_SGM42630_L();//默认低
    7. return 0;
    8. }

    2.2 开启电机运行

    1. void SGM42630_StepMotor_Enable(void)
    2. {
    3. NENABLE_SGM42630_L(); //0=使能PWM
    4. NSLEEP_SGM42630_H(); //1休眠禁用,0使能休眠
    5. }

    2.3 关闭电机运行

    1. void SGM42630_StepMotor_Disable(void)
    2. {
    3. NENABLE_SGM42630_H(); //1=失能PWM
    4. NSLEEP_SGM42630_L(); //1休眠禁用,0使能休眠
    5. }

    2.4 电机正转

    1. //正转
    2. void SGM42630_StepMotor_Dir_FWD(void)
    3. {
    4. DIR_SGM42630_L(); //0正转,1反转
    5. }

    2.5 电机反转

    1. //反转
    2. void SGM42630_StepMotor_Dir_REV(void)
    3. {
    4. DIR_SGM42630_H(); //0正转,1反转
    5. }

    2.6 电机细分

    1. //细分数
    2. void SGM42630_StepMotor_MicroStep(u8 stepsSet)
    3. {
    4. if(stepsSet==8)
    5. {
    6. USMO_SGM42630_H(); //00:全速;01:1/2细分;10:1/4细分;11:1/8细分
    7. USM1_SGM42630_H();
    8. }
    9. else if(stepsSet==4)
    10. {
    11. USMO_SGM42630_L(); //00:全速;01:1/2细分;10:1/4细分;11:1/8细分
    12. USM1_SGM42630_H();
    13. }
    14. else if(stepsSet==2)
    15. {
    16. USMO_SGM42630_H(); //00:全速;01:1/2细分;10:1/4细分;11:1/8细分
    17. USM1_SGM42630_L();
    18. }
    19. else if(stepsSet==1)
    20. {
    21. USMO_SGM42630_L(); //00:全速;01:1/2细分;10:1/4细分;11:1/8细分
    22. USM1_SGM42630_L();
    23. }
    24. }

    2.7 设置电机步数

    2.7.1 输入电机步数端口(初始化)

    1. volatile s32 iSGM42630_StepMotor_Steps=0;//iSGM42630_StepMotor_Steps==0 停止电机
    2. u8 bSGM42630_StepMotor_DelayMode=0;
    3. void SGM42630_StepMotor_SetMove(int steps)
    4. {
    5.     iSGM42630_StepMotor_Steps = steps;
    6. }
    1. //归零
    2. void SGM42630_StepMotor_ReturnZero(void)
    3. {
    4. SGM42630_StepMotor_Move(-12000);
    5. SGM42630_StepMotor_Move(5000);//全两处差不多1250步 8细分为10000微步 到尽头会返回转
    6. }

    2.7.2 电机步数实现

    1. void SGM42630_StepMotor_Move(int steps)
    2. {
    3. u32 movesteps;
    4. bSGM42630_StepMotor_DelayMode=1;
    5. SGM42630_StepMotor_Enable();
    6. if(steps>0)
    7. {
    8. SGM42630_StepMotor_Dir_FWD();
    9. movesteps=steps;
    10. }
    11. else
    12. {
    13. SGM42630_StepMotor_Dir_REV();
    14. movesteps=-steps;
    15. }
    16. while(movesteps--)
    17. {
    18. //负向限位判断
    19. if(LIMIT_UP_IN()>0 && steps<0)
    20. {
    21. break;
    22. }
    23. STEP_SGM42630_H();
    24. delay_us(100);
    25. STEP_SGM42630_L();
    26. delay_us(100);
    27. }
    28. SGM42630_StepMotor_Disable();
    29. bSGM42630_StepMotor_DelayMode=0;
    30. }

     8.7.3 放入循环,利用每次循环处理

    这样利用全局变量bSGM42630_StepMotor_DelayMode表示状态位,为1为固定步数模式输出。为0为循环步数模式输出。

    在每次循环中判断设定步数(全局变量)iSGM42630_StepMotor_Steps的值,如果为0了则需要退出执行,如果大于零,则需要在每一次循环中产生一个高低电平。

    1. void SGM42630_StepMotor_SetMove(int steps)
    2. {
    3. iSGM42630_StepMotor_Steps = steps;
    4. }
    5. void SGM42630_StepMotor_StepsRunLoop(void)
    6. {
    7. static u8 state=0;
    8. if(bSGM42630_StepMotor_DelayMode==1)return;
    9. if(iSGM42630_StepMotor_Steps==0)
    10. {
    11. SGM42630_StepMotor_Disable();
    12. state=0;
    13. return;
    14. }
    15. if(iSGM42630_StepMotor_Steps>0)
    16. {
    17. SGM42630_StepMotor_Enable();
    18. SGM42630_StepMotor_Dir_FWD();//正转
    19. if(state==0)
    20. {
    21. STEP_SGM42630_H();
    22. state=1;
    23. }
    24. else
    25. {
    26. STEP_SGM42630_L();
    27. iSGM42630_StepMotor_Steps--;
    28. state=0;
    29. }
    30. }
    31. else if(iSGM42630_StepMotor_Steps<0)
    32. {
    33. SGM42630_StepMotor_Enable();
    34. SGM42630_StepMotor_Dir_REV();//反转
    35. if(state==0)
    36. {
    37. STEP_SGM42630_H();
    38. state=1;
    39. }
    40. else if(state==1)
    41. {
    42. STEP_SGM42630_L();
    43. iSGM42630_StepMotor_Steps++;
    44. state=0;
    45. }
    46. }
    47. }

     2.8 控制协议

    1. case 0x0C://调焦电机步数控制
    2. if(recMotorCtrl_Def->motorCtrlMode == 0x10)//向前
    3. {
    4. pos = recMotorCtrl_Def->motorCtrlStep;
    5. SGM42630_StepMotor_SetMove(pos);
    6. }
    7. else if(recMotorCtrl_Def->motorCtrlMode == 0x01)//向后
    8. {
    9. pos = recMotorCtrl_Def->motorCtrlStep;
    10. SGM42630_StepMotor_SetMove(-pos);
    11. }

    2.9 代码实现

    在系统快速循环中进行处理:

    1. extern void Timer100us_loop(void)
    2. __weak void Timer100us_loop(void)
    3. {
    4.         
    5. }
    6.  
    7. uint32_t count_Timer100us_loop = 0;
    8. //TIM7调用函数100us
    9. int TIM7_PeriodCallback(TIM_HandleTypeDef *htim)
    10. {
    11.     count_Timer100us_loop++;
    12.     Timer100us_loop();
    13.     return 0;
    14. }
    1. //定时器中断产生100us查询循环
    2. void Timer100us_loop(void)
    3. {
    4. device_fast_loop();//设备快速LOOP
    5. }
    1. #include "SGM42630.h"
    2. u32 count_runMotor = 0;
    3. void device_fast_loop(void)
    4. {
    5. if(count_runMotor>=0)
    6. {
    7. SGM42630_StepMotor_StepsRunLoop();
    8. count_runMotor = 0;
    9. }
    10. bsp_fast_loop();//
    11. }
  • 相关阅读:
    python library reference
    「Python条件结构」if…elif…else结构根据输入x的值求y的值(1)
    基于SpringBoot的学科竞赛管理系统的设计与实现
    什么是APS系统?导入APS要注意什么?值得反复观看
    【云平台】云IDE体验
    工程伦理--9.3 工程师的能力标准
    Excel中插入加乘混合公式
    高通Android10 移植exFat格式
    Linux常用命令:文件及磁盘
    Spring application.properties
  • 原文地址:https://blog.csdn.net/Roger_717/article/details/126207557