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次的功能
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)