基于MSPM0L1306 LaunchPad的四相五线式步进电机驱动
<div class='showpostmsg'><p> 承接上期的“点灯控制”帖子,这期使用MSPM0L1306 LaunchPad开发板对常见的四相五线式步进电机进行驱动。电机型号:28BYJ48,本次实验是基于“pwm_led_driver_LP_MSPM0L1306_nortos_ticlang”例程展开的,该工程实现LED2指示灯的呼吸效果。</p><p> 首先打开“Code Composer Studio”工具,导入SDK,勾选需要加载的参考例程,这里选择采用TI官方编译器的“pwm_led_driver_LP_MSPM0L1306_nortos_ticlang”例程。</p>
<div style="text-align: left;"></div>
<div style="text-align: left;"> 在工程的根目录下,手动创建“bsp_uln2003.c”与“bsp_uln2003.h”源文件,双击打开“pwm_led_driver.syscfg”文件,调出sysconfig图形设置界面。</div>
<div style="text-align: left;">
<div style="text-align: left;">
<div style="text-align: left;"></div>
<div style="text-align: left;"> 根据功能需求,使用到4个GPIO口,实现对四相的控制。</div>
<div style="text-align: left;">
<div style="text-align: left;"></div>
<p> 添加4个有效的GPIO口,如下图所示。</p>
<div style="text-align: left;"></div>
<div style="text-align: left;"></div>
<p> 编译后,在“Generated Source”目录下自动更新“ti_msp_dl_config.c”与“ti_msp_dl_config.h”源文件。</p>
<div style="text-align: left;"></div>
<p> 根据“ti_msp_dl_config.h”源文件,可清晰得知道系统自动分配的有效GPIO口。</p>
<div style="text-align: left;"></div>
<p> 由上述系统分配,在“bsp_uln2003.h”源文件中完善管脚的定义。</p>
<div style="text-align: left;"></div>
<p> 在工程Properties属性中,包含“bsp_uln2003.h”头文件所在的路径。</p>
<div style="text-align: left;">
<div style="text-align: left;"></div>
<p> </p>
</div>
<p> 接着编写初始化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->AB->B->BC->C->CD->D->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>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 <= 10) {
mode = 1;
} // if reached lowest dc (10%), increase dc
else if (dc >= 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> 编译后,直接debug即可将程序下载到开发板中,硬件连线如下:</p>
<div style="text-align: left;"></div>
<p> 基本实现了步进电机的驱动,逆时针旋转的演示效果如下所示,此次分享告一段落,谢谢EEWorld提供的评测机会,精彩再续。</p>
<p>0670379b944961843b2144479e0e8b39<br />
</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> <p>说的很对,可以经典,使用相关技术可以得到非常好的帮忙,这心魔久哦没有用</p><br/>
页:
[1]