求一个C语言程序,用msp430控制步进电机启动,停止,正转和反转。在线等,急求,给高分~~

求一个C语言程序,用msp430控制步进电机启动,停止,正转和反转。在线等,急求,给高分~~,第1张

我给你一段作为参册磨考,最近正在研究这个玩意。让步进电机转动很简单,最简颤或单的方式就是依次给它的每一项一个脉冲(脉冲时间适具体情况而定)。首先这个程序是针对4项步进电机的,采用单4拍转动的方式。步进电机还有其他参数,比如转速等等,都要考虑在内。步进电机子程序放在定时器中断里面。不是特别精确。能用州洞斗。里面设立了几个标志,你应该能看懂

void StepMotor(void) //步进电机子函数

{

//正转//

if (MOTORCONTROL==2)

{

if(motortime<3) //转的圈数。

{

motorABCD++

switch( motorABCD ) //精度要求不高,改8拍为4拍转动方式

{

case 2MS:

m1=0

m2=1

m3=1

m4=1

break

case 3MS:

m1=1

m2=0

m3=1

m4=1

break

case 4MS:

m1=1

m2=1

m3=0

m4=1

break

case 5MS:

m1=1

m2=1

m3=1

m4=0

motortime++

motorABCD=1MS

break

}

}

}

//反转//

if (MOTORCONTROL==1)

{

if(motortime<3) //转的圈数。

{

motorABCD++

switch( motorABCD ) //精度要求不高,改8拍为4拍转动方式

{

case 2MS:

m1=0

m2=1

m3=1

m4=1

break

case 3MS:

m1=1

m2=1

m3=1

m4=0

break

case 4MS:

m1=1

m2=1

m3=0

m4=1

break

case 5MS:

m1=1

m2=0

m3=1

m4=1

motortime++

motorABCD=1MS

break

}

}

}

if(motortime==3)

{

motortime=0

MOTORCONTROL=0

}

}//子函数结尾

void MOTOR() interrupt 3//定时器1 中断程序

{

TH1=(65536-990)/256 /*恢复计数初值*/

TL1=(65536-990)%256

StepMotor()

}

正好前些日子写了驱动直核陆弯流减速电机的程序,分享给你。

#include "msp430x16x.h"

#include "config.h"

#include "key.h"

#include "12864.h"

说明:4*4矩阵键盘的第四列分明用于控制正反转,加速和减速;

正反转通过控制直流电机引脚的电平高低来实现。速度是通过PWM波控制。PWM波是通过定时器中断(CCR1,CCR0)来取反输出的。P1.0和P1.1输出通过LN298放大连至直流电机。

uchar IFG

void TimerA_Init() //定时器初始化

{

TACTL |= TASSEL1+MC0+ID1+ID0+TACLR+TAIE//SMCLK,增计数,8分频,清除TAR,中断允许

CCTL0 |= CCIE

CCTL1 |= CCIE

CCR0 = 100

CCR1 = 50

}

void main()

{

// Stop watchdog timer to prevent time out reset

WDTCTL = WDTPW + WDTHOLD

Clock_Init()

P1DIR=0xff

TimerA_Init() ////定时器初始化

IFG=1

P1OUT &=~BIT1//初始化方向

LCD_Port_Init()//初始化端口

LCD_Init()//12864显示屏初始化,用于显示占空比

Disp_HZ(0x80,"CCR1:")

Disp_u_2num(0x90,CCR1)

Key_Port_Init()

_EINT() //开启中断

while(1)

{

}

}

#pragma vector=PORT_VECTOR

__interrupt void Port2_VECTOR()

{

if((PORTIFG&0xf0)!=0)//任意键被按下会引悉衡发中断,P1IFG某一位置位

{

keyscanf()

}

switch(key)

{

case 12:IFG=1P1OUT &=~BIT1break

case 13:IFG=0P1OUT &=~BIT0break

case 14:if(CCR1<90)CCR1+=10Disp_u_2num(0x90,CCR1)break

case 15:if(CCR1>=20&&CCR1<改闷100)CCR1-=10Disp_u_2num(0x90,CCR1)break

}

PORTIFG=0

PORTOUT=0

}

#pragma vector = TIMERA1_VECTOR

__interrupt void Timer_A1(void)

{

switch(TAIV) //读中断向量寄存器

{

case 2:if(IFG) P1OUT &=~BIT0

else P1OUT &=~BIT1break

}

}

#pragma vector = TIMERA0_VECTOR

__interrupt void Timer_A0(void)

{

if(IFG) P1OUT |=BIT0

else P1OUT |=BIT1

}

不好意思对MSP430单片机不太熟悉。。

在网上查了下它的datasheet,在你的代码里加扒昌明了些注释,可以参考看看。

#include <msp430.h>

void main(void)

{

WDTCTL = WDTPW | WDTHOLD // 停止Watchdog timer

P1DIR = 0x41 //01000001 -> Port P1.0和P1.6方向置为春告输出

P1OUT = 0x00 //初期化P1.0和P1.6为输出低电平

int i,a,j

float x,y

a=0

while(a<150)

{

a++ //循环150次

for(i=0i<108i++)

P1OUT = 0x41 //108个clock周期内让P1.0和P1.6输出高电平

for(j=0j<2500j++)

P1OUT = 0x00 //2500个clock周期内让P1.0和P1.6输出低电平

}

//总体上来看就是让P1.0和P1.6对应的两个引脚输出150个周期性的高低电平(可能经过施密特触发器进行了整形)

//每个周期中高电平持续108个单位时间,低电平持续2500个单位时间

//由于不清楚P1.0和P1.6是怎么接外设的迅答所以也不好说怎么调速的

//假设是某种电机,在高电平的时候转速快,在低电平的时候转速慢的话

//这个代码就可以实现让电机在108个单位时间快转,2500个单位时间慢转,并持续150次的功能

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12500838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存