本帖最后由 zdldcyy 于 2013-5-5 10:45 编辑
本人正在用MSP430G2553做一个两相四线步进电机的驱动细分,模拟SPWM八细分。程序写好了,电机也动了,但振动特别大,还不如半步的稳定。麻烦做过步进电机细分的大虾帮我看看,问题出在哪呢。。。
#include
#include "M_2.h"
unsigned int PDR_A[]={ //八细分正弦表,8000*sinθ
8000, 7846, 7391, 6652, 5656, 4445, 3061, 1561,
0, 1561, 3061, 4445, 5656, 6652, 7391, 7846,
};
unsigned int PDR_B[]={
0, 1561, 3061, 4445, 5656, 6652, 7391, 7846,
8000, 7846, 7391, 6652, 5656, 4445, 3061, 1561,
};
unsigned char DIR[] = {
0xa0, 0x60, 0x50, 0x90, //IN1-4输入
};
void PWM_Init()
{
P1DIR|=0xf0; //1111,0000 P1.4--P1.7输出控制IN1-IN4
P1OUT&=0x0f;
P2DIR|=0X02; //0000,0010 P2.1--TA1.1--CCR1--PWM_1
P2DIR|=0X10; //0001,0000 P2.4--TA1.2--CCR2--PWM_2
P2SEL|=0X12; //0001,0010 开启第二引脚功能
TA1CTL |=TASSEL_2+MC_1+TACLR; //时钟源选择SMCLK增计数模式 TA设置
TA1CCTL1 |=OUTMOD_7; //模式7 高电平PWM输出 PWM设置
TA1CCTL2 |=OUTMOD_7;
TA1CCR0 = Freq-1;
TA1CCR1 = 0;
TA1CCR2 = 0;
TA1CCTL0 = CCIE; // CCR0 interrupt enabled
_EINT();
}
void main()
{
//unsigned int i=0;
WDTCTL=WDTPW+WDTHOLD;
PWM_Init();
while(1)
{}
}
#pragma vector=tiMER1_A0_VECTOR
__interrupt void PWM_ISR (void)
{
// temp1 = (unsigned int)(Freq*PDR_1[cont]);
// temp2 = (unsigned int)(Freq*PDR_2[cont]);
// TA1CCR1 = temp1;
// TA1CCR2 = temp2;
TA1CCR1 = PDR_A[cont];
TA1CCR2 = PDR_B[cont];
if(cont%8==0)
P1OUT = DIR[i++%4];
cont++;
if(cont==16)
cont = 0;
}
0
|
|
|
|