yin_wu_qing 发表于 2024-2-26 22:20

基于MSPM0L1306 LaunchPad的四相五线式步进电机驱动

<div class='showpostmsg'><p>&nbsp; &nbsp; &nbsp; 承接上期的&ldquo;点灯控制&rdquo;帖子,这期使用MSPM0L1306 LaunchPad开发板对常见的四相五线式步进电机进行驱动。电机型号:28BYJ48,本次实验是基于&ldquo;pwm_led_driver_LP_MSPM0L1306_nortos_ticlang&rdquo;例程展开的,该工程实现LED2指示灯的呼吸效果。</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp;首先打开&ldquo;Code Composer Studio&rdquo;工具,导入SDK,勾选需要加载的参考例程,这里选择采用TI官方编译器的&ldquo;pwm_led_driver_LP_MSPM0L1306_nortos_ticlang&rdquo;例程。</p>

<div style="text-align: left;"></div>

<div style="text-align: left;">&nbsp; &nbsp; &nbsp; &nbsp; 在工程的根目录下,手动创建&ldquo;bsp_uln2003.c&rdquo;与&ldquo;bsp_uln2003.h&rdquo;源文件,双击打开&ldquo;pwm_led_driver.syscfg&rdquo;文件,调出sysconfig图形设置界面。</div>

<div style="text-align: left;">
<div style="text-align: left;">
<div style="text-align: left;"></div>

<div style="text-align: left;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;根据功能需求,使用到4个GPIO口,实现对四相的控制。</div>

<div style="text-align: left;">
<div style="text-align: left;"></div>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 添加4个有效的GPIO口,如下图所示。</p>

<div style="text-align: left;"></div>

<div style="text-align: left;"></div>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 编译后,在&ldquo;Generated Source&rdquo;目录下自动更新&ldquo;ti_msp_dl_config.c&rdquo;与&ldquo;ti_msp_dl_config.h&rdquo;源文件。</p>

<div style="text-align: left;"></div>

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 根据&ldquo;ti_msp_dl_config.h&rdquo;源文件,可清晰得知道系统自动分配的有效GPIO口。</p>

<div style="text-align: left;"></div>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 由上述系统分配,在&ldquo;bsp_uln2003.h&rdquo;源文件中完善管脚的定义。</p>

<div style="text-align: left;"></div>

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;在工程Properties属性中,包含&ldquo;bsp_uln2003.h&rdquo;头文件所在的路径。</p>

<div style="text-align: left;">
<div style="text-align: left;"></div>

<p>&nbsp;</p>
</div>

<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;接着编写初始化GPIO口及驱动代码,部分代码展示如下:</p>

<pre>
<code class="language-cpp">#include "bsp_uln2003.h"
#include "ti_msp_dl_config.h"

void ULN2003_GPIO_Init(void)
{
DL_GPIO_enableOutput(GPIOA,ULN2003_GPIO_PIN_A);
DL_GPIO_enableOutput(GPIOA,ULN2003_GPIO_PIN_B);
DL_GPIO_enableOutput(GPIOA,ULN2003_GPIO_PIN_C);
DL_GPIO_enableOutput(GPIOA,ULN2003_GPIO_PIN_D);
DL_GPIO_clearPins(GPIOA,ULN2003_GPIO_PIN_A);
DL_GPIO_clearPins(GPIOA,ULN2003_GPIO_PIN_B);
DL_GPIO_clearPins(GPIOA,ULN2003_GPIO_PIN_C);
DL_GPIO_clearPins(GPIOA,ULN2003_GPIO_PIN_D);
}</code></pre>

<pre>
<code class="language-cpp">#include "ti_msp_dl_config.h"
#include "oled.h"
#include "bsp_uln2003.h"

int pwm_count = 1800; // initial ccr count based on 10% duty cycle
int dc = 10;          // initialized to 10 % duty cycle
int mode = 1;         // 1 = up (will indicate you need to increase dc), 0 = down (will
                      // decrease dc)

#define STEPMOTOR_DIRECTION               0   // 1:顺时针0:逆时针
#define STEPMOTOR_SPEED                     10// 速度,该值越小,速度越快,最小不能小于10

// 速度,该值越小,速度越快,最小不能小于10
uint8_t speed=STEPMOTOR_SPEED;
// 转动圈数:28BYJ-48步进电机的步距角度为5.625/64,即每64个脉冲转5.625度
// 要转一圈需要360/5.625*64=4096个脉冲。
// 8个节拍控制:A-&gt;AB-&gt;B-&gt;BC-&gt;C-&gt;CD-&gt;D-&gt;DA
uint16_t step_motor={0xFC7F,0xFCFF,0xFCBF,0xFDBF,0xFD3F,0xFF3F,0xFE3F,0xFE7F};

/**
* 函数功能: 输出一个数据给ULN2003从而实现向步进电机发送一个脉冲
* 输入参数: step:序列号,选择step_motor数组对应的数据
*         direction:方向选择
*               可选值:0:顺时针
*                     1:逆时针
* 返 回 值: 无
*/
static void step_motor_pulse(uint8_t step,uint8_t direction)
{
      uint8_t temp=step;

      if(direction==0)
      {
      temp=8-step;
      }
      switch(temp)
      {
      case 0:
          A_ON();B_OFF();C_OFF();D_OFF();
          break;
      case 1:
          A_ON();B_ON();C_OFF();D_OFF();
          break;
      case 2:
          A_OFF();B_ON();C_OFF();D_OFF();
          break;
      case 3:
          A_OFF();B_ON();C_ON();D_OFF();
          break;
      case 4:
          A_OFF();B_OFF();C_ON();D_OFF();
          break;
      case 5:
          A_OFF();B_OFF();C_ON();D_ON();
          break;
      case 6:
          A_OFF();B_OFF();C_OFF();D_ON();
          break;
      case 7:
          A_ON();B_OFF();C_OFF();D_ON();
          break;
      default:
          break;
      }
}

void motor_run(void)
{
      static uint8_t count=0,step=0;
      static uint16_t pulse_count=0;

      for(int time=4500; time&gt;0; time--)
      {
      count++;
      if(count==speed)
      {
          step_motor_pulse(step,STEPMOTOR_DIRECTION);
          step++;
          pulse_count++;
          if(step==8) step=0;
          count=0;
      }
      if(pulse_count==4096)
      {
          pulse_count=0;
      }
      delay_cycles(28000);
      }
}

int main(void) {
SYSCFG_DL_init();
ULN2003_GPIO_Init();
NVIC_EnableIRQ(PWM_0_INST_INT_IRQN);
DL_TimerG_startCounter(PWM_0_INST);

while (1) {
      motor_run();
    __WFI();
}
}

void PWM_0_INST_IRQHandler(void) {
switch (DL_TimerG_getPendingInterrupt(PWM_0_INST)) {
case DL_TIMER_IIDX_LOAD:
    if (dc &lt;= 10) {
      mode = 1;
    }            // if reached lowest dc (10%), increase dc
    else if (dc &gt;= 90) {
      mode = 0;
    }             // if reached highest dc (90%), decrease dc
    if (mode) {
      pwm_count -= 10;
      dc += 1;
    }             // up
    if (!mode) {
      pwm_count += 10;
      dc -= 1;
    }             // down
    DL_TimerG_setCaptureCompareValue(PWM_0_INST, pwm_count,DL_TIMER_CC_1_INDEX);
    break;
default:
    break;
}
}
</code></pre>

<p>&nbsp; &nbsp; &nbsp; &nbsp;编译后,直接debug即可将程序下载到开发板中,硬件连线如下:</p>

<div style="text-align: left;"></div>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 基本实现了步进电机的驱动,逆时针旋转的演示效果如下所示,此次分享告一段落,谢谢EEWorld提供的评测机会,精彩再续。</p>

<p>0670379b944961843b2144479e0e8b39<br />
&nbsp;</p>

<div style="text-align: center;"></div>
</div>
</div>
</div>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

wwwwwgghhhhhhh 发表于 2024-3-2 12:18

<p>说的很对,可以经典,使用相关技术可以得到非常好的帮忙,这心魔久哦没有用</p><br/>
页: [1]
查看完整版本: 基于MSPM0L1306 LaunchPad的四相五线式步进电机驱动