AVR stdio寫的ATMEGA16控制步進電機正反轉和速度,供大家免費參閱和批評
適合初學者,總共七個按鍵 三個按鍵控制三個速度正轉,三個按鍵控制三個速度反轉,一個按鍵控制停止。
本程序控制步進電機是和步進電機驅動器相連接的,所以脈沖只有一路,如果想直接連步進電機只需要稍加改動即可。
QQ截圖20170118093114.png (56.74 KB, 下載次數: 136)
下載附件
2017-1-18 09:31 上傳
0.png (59.43 KB, 下載次數: 134)
下載附件
2017-2-12 17:18 上傳
完整代碼下載:
MEGA16stepmotor.zip
(95.53 KB, 下載次數: 129)
2017-1-18 09:31 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
主程序預覽:
- #define F_CPU 800000UL
- #include <avr/io.h>
- #include <util/delay.h>
- #define INT8U unsigned int
- #define INT16U unsigned int
- const INT8U FFW[]={0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00};//一拍p0口輸出8個脈沖
- //按鍵定義
- #define K1_DOWN()((PIND &_BV(PD0)) == 0x00)//K1:正轉速度1
- #define K2_DOWN()((PIND &_BV(PD1)) == 0x00)//K2:正轉速度2
- #define K3_DOWN()((PIND &_BV(PD2)) == 0x00)//K3:正轉速度3
- #define K4_DOWN()((PIND &_BV(PD3)) == 0x00)//K4:停止
- #define K5_DOWN()((PIND &_BV(PD4)) == 0x00)//K5:反轉速度1
- #define K6_DOWN()((PIND &_BV(PD5)) == 0x00)//K6:反轉速度2
- #define K7_DOWN()((PIND &_BV(PD6)) == 0x00)//K7:反轉速度3
- void STEP_MOTOR_FWRUN_1(INT8U n)
- {
- INT8U i,j;
-
- for(i=0;i<n;i++)//轉動n圈
- {
- for(j=0;j<16;j++)//循環(huán)輸出16*8拍
- {
- //if (K1_DOWN())break;
- if (K2_DOWN())break;
- if (K3_DOWN())break;
- if (K4_DOWN())return;//中途按下K4時電機停止轉動
-
- if (K5_DOWN())break;
- if (K6_DOWN())break;
- if (K7_DOWN())break;
- PORTB=FFW[j];
- _delay_us(50);
- }
- PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
- }
- }
- void STEP_MOTOR_FWRUN_2(INT8U n)
- {
- INT8U i,j;
-
- for(i=0;i<n;i++)//轉動n圈
- {
- for(j=0;j<16;j++)
- {
- if (K1_DOWN())break;
- // if (K2_DOWN())break;
- if (K3_DOWN())break;
- if (K4_DOWN())return;//中途按下K4時電機停止轉動
- if (K5_DOWN())break;
- if (K6_DOWN())break;
- if (K7_DOWN())break;
- PORTB=FFW[j];
- _delay_us(150);
- }
- PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
- }
- }
- void STEP_MOTOR_FWRUN_3(INT8U n)
- {
- INT8U i,j;
-
- for(i=0;i<n;i++)//轉動n圈
- {
- for(j=0;j<16;j++)
- {
- if (K1_DOWN())break;
- if (K2_DOWN())break;
- // if (K3_DOWN())break;
- if (K4_DOWN())return;//中途按下K4時電機停止轉動
-
- if (K5_DOWN())break;
- if (K6_DOWN())break;
- if (K7_DOWN())break;
- PORTB=FFW[j];
- _delay_us(300);
- }
- PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
- }
- }
- void STEP_MOTOR_CWRUN_5(INT8U n)
- {
- INT8U i,j;
-
- for(i=0;i<n;i++)//轉動n圈
- {
- for(j=0;j<16;j++)
- {
- if (K1_DOWN())break;
- if (K2_DOWN())break;
- if (K3_DOWN())break;
- if (K4_DOWN())return;//中途按下K4時電機停止轉動
-
- // if (K5_DOWN())break;
- if (K6_DOWN())break;
- if (K7_DOWN())break;
-
- PORTB=FFW[j];
- _delay_us(300);
- }
- PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
- }
- }
- void STEP_MOTOR_CWRUN_6(INT8U n)
- {
- INT8U i,j;
-
- for(i=0;i<n;i++)//轉動n圈
- {
- for(j=0;j<16;j++)
- {
- if (K1_DOWN())break;
- if (K2_DOWN())break;
- if (K3_DOWN())break;
- if (K4_DOWN())return;//中途按下K4時電機停止轉動
-
- if (K5_DOWN())break;
- //if (K6_DOWN())break;
- if (K7_DOWN())break;
-
- PORTB=FFW[j];//方向為0時正轉
- _delay_us(150);
- }
- PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
- }
- }
- void STEP_MOTOR_CWRUN_7(INT8U n)
- {
- INT8U i,j;
-
- for(i=0;i<n;i++)//轉動n圈
- {
- for(j=0;j<16;j++)
- { if (K1_DOWN())break;
- if (K2_DOWN())break;
- if (K3_DOWN())break;
- if (K4_DOWN())return;//中途按下K4時電機停止轉動
-
- if (K5_DOWN())break;
- if (K6_DOWN())break;
- // if (K7_DOWN())break;
- PORTB=FFW[j];
- _delay_us(50);
- }
- PORTB=0x01;//最后一圈之后輸出0x01這一拍電機回到起點
- }
- }
- void beep()
- {
- PORTC=0x40;
- _delay_ms(120);
- PORTC=0X00;
- }
- void initonbeep()
- {
- PORTC=0x40;
- _delay_ms(120);
- PORTC=0X00;
- _delay_ms(120);
- PORTC=0x40;
- _delay_ms(120);
- PORTC=0X00;
- _delay_ms(120);
- PORTC=0x40;
- _delay_ms(120);
- PORTC=0X00;
- _delay_ms(120);
- PORTC=0x40;
- _delay_ms(120);
- PORTC=0X00;
- }
- int main()
- {
- INT8U r=65535;
- DDRB=0xFF;PORTB=FFW[0]; //控 制輸出
- DDRD=0X00;PORTD=0xFF; //按鍵輸入
- DDRA=0X00;PORTA=0xFF; //方向信號
- DDRC=0XFF;PORTC=0x00; //蜂鳴器
- initonbeep ();
-
- while(1)
- {
-
- if(K1_DOWN())
- {
- _delay_us(200);
- if(K1_DOWN())
- {
- beep();
- //while(K1_DOWN()); //等待 K1 釋放
- PORTA=0x00; //方向信號為0
- STEP_MOTOR_FWRUN_1(r);//點擊正轉r圈
-
- }
- }
- if(K2_DOWN())
- {
- _delay_us(200);
- if(K2_DOWN())
- {
- beep();
- //while(K1_DOWN()); //等待 K1 釋放
- PORTA=0x00; //方向信號為0
- STEP_MOTOR_FWRUN_2(r);//點擊正轉r圈
- }
- }
- if(K3_DOWN())
- {
- _delay_us(200);
- if(K3_DOWN())
- {
- beep();
- //while(K1_DOWN()); //等待 K1 釋放
- PORTA=0x00; //方向信號為0
- STEP_MOTOR_FWRUN_3(r);//點擊正轉r圈
- }
- }
- if(K5_DOWN())
- {
- _delay_us(200);
- if(K5_DOWN())
- {
- beep();
- //while(K2_DOWN()); //等待K2釋放
- PORTA=0x01; //方向信號為1
- STEP_MOTOR_CWRUN_5(r); //電機反轉r圈
- }
- }
- if(K6_DOWN())
- {
- _delay_us(200);
- if(K6_DOWN())
- {
- beep();
- //while(K2_DOWN()); //等待K2釋放
- PORTA=0x01; //方向信號為1
- STEP_MOTOR_CWRUN_6(r); //電機反轉r圈
- }
- }
- if(K7_DOWN())
- {
- _delay_us(200);
- if(K7_DOWN())
- {
- beep();
- //while(K2_DOWN()); //等待K2釋放
- PORTA=0x01; //方向信號為1
- STEP_MOTOR_CWRUN_7(r); //電機反轉r圈
- }
- }
-
- }
- }
復制代碼 |