|
本實驗用的步進電機為6線四相, 實現控制步進電機的正反向, 加減速的控制.
//ICC-AVR application builder : 2005/4/9 上午 12:31:21
// Target : M16
// Crystal: 4.0000Mhz
#include <iom16.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
const uchar step[ ] ={0x11,0x99,0x88,0xcc,0x44,0x66,0x22,0x33}; // 1-2相方式 步進電機驅動代碼
//const uchar step[ ] ={0xcc,0x66,0x33,0x99,0xcc,0x66,0x33,0x99}; // 2相方式 步進電機驅動代碼
uchar j;turn;
uint s;
void port_init(void) //初始化端口
{
PORTA = 0xFF;
DDRA = 0xFF;
PORTB = 0x00;
DDRB = 0x00;
DDRC = 0xFF;
PORTD = 0x00;
DDRD = 0x00;
}
void init_devices(void) //初始化裝置
{
CLI();
port_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00;
SEI();
}
void delay(uint t) // 長延時
{
uint m,n;
for (m=0;m<t;m++)
{
for (n=0;n<100;n++);
};
}
void delay_2(uint t) // 短延時
{
uint i;
for (i=0;i<t;i++);
}
void scan_key() // 按鍵掃瞄
{
if ((PIND & 0x01) == 0) // 減速
{
PORTA = 0xfe;
delay_2(1000);
s = s-100;
}
if ((PIND & 0x2) == 0) // 加速
{
PORTA = 0xfe;
delay_2(1000);
s = s+100;
}
if ((PIND & 0x4) == 0) // 改變轉向
{
PORTA = 0xfe;
delay_2(1000);
turn = ~turn;
}
while((PIND & 0x07) != 0x07); // 判斷按鍵是不是放開
PORTA = 0xff;
}
void main(void)
{
init_devices();
turn = 0x01;
j = 0;
s = 1000;
for (;;)
{
scan_key();
if ((turn & 0xff) == 0x01) // 判斷方向, turn == 0x01 時為正轉
{
j++;
if (j>8){ j = 0;};
}
else
{
if (j==0){ j = 8;};
j--;
}
if (s <= 50){ s=1000;}; //
PORTC = step[j]; // 步進驅動信號輸出
PORTA = 0xfd; // 開led 顯示
delay(s); // 延時, 用來控制速度
PORTA = 0xff; // 關led 顯示
}
}
實驗板接線:
PC0 ----> JH1.1
PC1 ----> JH1.2
PC2 ----> JH1.3
PC3 ----> JH1.4
PD0 ----> JG5.K4
PD1 ----> JG5.K3
PD2 ----> JG5.K2
PA0 ----> JA.1
PA1 ----> JA.2
步進電機接線:
JH2.1 ----> 步進電機 A 相
JH2.2 ----> 步進電機 B 相
JH2.3 ----> 步進電機 A~ 相
JH2.4 ----> 步進電機 B~ 相
AB相的中心抽頭接電源正極. |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|