c語言控制步進電機
『壹』 怎麼用c語言控制步進電機
不清楚您具體採用的什麼控制器(PLC或是單片機)和什麼步進電機。
這里當著您使用的是單片機與5線4相電機
通常情況下控制單片機的4個IO口,使其都為高電平。
再按照一個方向輪流使其中一個IO口變為低電平(間隔這里先為2ms,修改間隔時間可以控制轉速),就可以驅動步進電機轉起。
『貳』 請求:單片機控制步進電機C語言編程
你描述的要求不是很明了,應該分步描述,每一步的要求分步寫出來,大家容易看懂.
明白你的意思了!
只有兩個口控制步進電機的話,需要外加步進電機驅動器.
p1.0控制方向,p1.0是1(0)電機向前,p1.0是0(1)步進電機向後
p1.1控制步數和速度,用一個PWM就可以了,直接用定時器來控制.pwm頻率越高速度越快,但要用在定時器中斷裡面計算步進的步數來確定走了多遠.
至於你說的中斷信號,可以用循環掃描的方法,在程序中掃描輸入中斷信號,當檢測到信號後改變P1.5的電平,即可點亮LED
『叄』 控制步進電機C語言代碼解釋
我之前做過一個,步進電機模擬電梯運行的控製程序,是那種發一個信號走一步的那種,步進角比較大,好像是15度左右,我當時的做法就是加入系統延時,讓程序給步進電機發送信號,通過控制延時來決定單位時間內步進電機轉動的次數
我用的是永磁式步進電機,不知道你用的是什麼樣的,我使用的這種,步進角比較大,步進電機都是一步步轉的,轉快了就看不出步進電機是一步步轉了
而當是步進電機正轉是按這樣的順序發送信號,abcd,反轉是dcba
轉多少圈,就是循環給步進電機發送信號,使用程序控制發送信號的次數,至於怎麼控制只要知道介面函數什麼的還是不難的。
如果還是不大明白,我倒是可以幫你看看程序
『肆』 步進電機驅動程序C語言
步進電機控製程序(c語言+51單片機)
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define ms *77
// f = 12 M
#define LEDLen 4
#define Dj_star() {IE=0x81; pri_dj=0; }
#define Dj_stop() {IE=0x00; pri_dj=1; P1=0xff; shache="0"; delay(800ms); delay(800ms);delay(400ms); shache = 1; }
#define Chilun_Num 8
/* 齒輪數 8 個*/
#define set_display_num() { LEDBuf[0] = tmp / 1000; LEDBuf[1] = tmp / 100 % 10; \
LEDBuf[2] = tmp / 10 % 10; LEDBuf[3] = tmp % 10; }
uchar LEDBuf[LEDLen] = {0,0,0,0};
void read_num (); /* 讀播碼盤 到 set_round_num * 8 */
void display ();
void delay(uint delay_time) { uint i; for (i=0; i < delay_time ; i++) ; }
void run ();
void fx_run();
uint round_num = 0; /* 記錄已轉的 齒輪數 , 中斷1次 加 1*/
uint set_round_num = 0; /* 播碼盤設置 圈數 */
uint set_pwm_width = 0; /* 播碼盤設置 步進電機 正向速度 */
bit one_round_flg = 0;
sbit led_1000 = P0^7; //use for display
sbit led_100 = P0^6; //use for display
sbit led_10 = P0^5; //use for display
sbit led_1 = P0^4; //use for display
sbit key_start = P3^0;
sbit key_puse = P3^0;
sbit key_clear = P3^1;
/* P3^2 接齒輪感測器 中斷 */
sbit bujin_zx_stop = P3^3; /* 接步進電機 ,正向到位感測器 ,為 0 停機 */
sbit bujin_fx_stop = P3^4; /* 接步進電機 ,反向到位感測器 ,為 0 停機 */
sbit shache = P3^5; /* 接剎車控制繼電器 0 電位有效 */
sbit pri_dj = P3^6; /* 接主電機控制繼電器 0 電位有效 */
void main(){
TCON = 0x01;
display();
while(1) {
IE="0x00";
round_num = 0;
display();
if ( bujin_fx_stop ) fx_run();
while ( key_start );
delay ( 8ms );
if(!key_start){
read_num();
//set_round_num = 8;
while ( !key_start );
run ();
fx_run();
}
}
}
void run () {
#define Delay_time 180
/* 轉一圈 50 次循環,每循環 4 步 ,50 * 4 = 200 , 200 * 1。8 = 360 */
uchar i ;
P1 = 0xff;
set_pwm_width = 15 + set_pwm_width / 10;
while ( 1 ) {
while( !shache | !key_start );
Dj_star();
for ( i="0" ; bujin_zx_stop & !pri_dj;i++ ){
P1 = 0xf9;
delay ( Delay_time ); // bujin_zx_stop = P3^3;
P1 = 0xfc; // bujin_fx_stop = P3^4;
delay ( Delay_time); // key_puse = P3^0;
P1 = 0xf6; // key_clear = P3^1;
delay ( Delay_time ); // shache = P3^5;
P1 = 0xf3; // pri_dj = P3^6;
delay ( Delay_time );
if( i == set_pwm_width ) { P1 = 0xff; i = 0; one_round_flg = 0; while ( !one_round_flg & key_puse );}
if(!key_puse) { delay(4ms); if(!key_puse) break; }
}
P1 = 0xff;
if ( pri_dj ) break;
if ( !key_puse ) {
delay ( 8ms );
if ( !key_puse ) {
Dj_stop();
while ( !key_puse );
// next pree key
while( !shache );
while(1){
while ( key_puse & key_clear );
delay ( 8ms );
if ( !key_clear ) { round_num = 0; display(); }
if ( !key_puse ) break;
}
while( !key_puse );
delay(8ms);
while( !key_puse );
}
}
}
}
void ext_int0(void) interrupt 0 { /* 主電機 齒輪 中斷 */
uint tmp;
EA = 0;
if( !pri_dj ){
round_num ++;
if (round_num % Chilun_Num == 0 ){
one_round_flg = 1;
tmp = round_num / Chilun_Num ;
set_display_num();
P0 = 0xf0;
P0 = P0 | LEDBuf[0] ;
led_1000 = 0;
P0 |= 0xf0;
P0 = 0xf0;
P0 = P0 | LEDBuf[1] ;
led_100 = 0;
P0 |= 0xf0;
P0 = 0xf0;
P0 = P0 | LEDBuf[2] ;
led_10 = 0;
P0 |= 0xf0;
P0 = 0xf0;
P0 = P0 | LEDBuf[3] ;
led_1 = 0;
P0 |= 0xf0;
P0 = 0xf0;
}
if ( round_num >= set_round_num ) Dj_stop();
}
EA = 0x81;
}
void display(){
uchar i;
uint tmp = 0;
tmp = round_num / Chilun_Num ;
set_display_num();
for(i = 0; i < LEDLen ; i ++){
P0 = 0xf0;
P0 = P0 | LEDBuf[i] ;
if(i==0) led_1000 = 0; //P0^4
if(i==1) led_100 = 0; //P0^5
if(i==2) led_10 = 0; //P0^6
if(i==3) led_1 = 0; //P0^7
P0 |= 0xf0;
}
P0 = 0xf0;
}
void read_num(){
/* 讀播碼盤 到 set_round_num ,set_pwm_width */
uchar tmp;
P2 = 0xFF;
P2 = 0xEF; // 1110 1111
delay ( 1ms );
tmp = ~(P2 | 0xF0);
P2 = 0xDF; // 1101 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0 )) * 10 + tmp;
set_round_num = tmp;
P2 = 0xBF; // 1011 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0));
P2 = 0x7F; // 0111 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0)) * 10 + tmp;
set_round_num = set_round_num + tmp * 100;
set_round_num = set_round_num * Chilun_Num;
P2 = 0xFF;
P1 = 0xbF; // 0111 1111
delay ( 1ms );
tmp = ~(P2 | 0xF0) ;
P1 = 0xFF;
P2 = 0xFF;
P1 &= 0x7F; // 1011 1111
delay ( 1ms );
tmp = (~(P2 | 0xF0)) * 10 + tmp ;
set_pwm_width = tmp ;
P1 = 0xFF;
P2 = 0xFF;
}
void fx_run(){
#define f_Delay_time 180
while ( bujin_fx_stop ) { /* 反向 回車 直到 感測器 動作*/
P1 = 0xf3; //0011
delay ( f_Delay_time );
P1 = 0xf6; //0110
delay ( f_Delay_time );
P1 = 0xfc; //1100
delay ( f_Delay_time );
P1 = 0xf9; //1001
delay ( f_Delay_time );
}
P1 = 0xff;
}
『伍』 C語言控制步進電機程序
#include <reg52.h>
sbit P0_0=P0^0;
sbit P0_1=P0^1;
unsigned char codes[2][8]={{0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03}, //9,18,36,45,54,63,72,81度 順時針
{0x0b,0x09,0x0d,0x0c,0x0e,0x06,0x07,0x03}}; //9,18,36,45,54,63,72,81度 逆時針
unsigned char counts,flag,t;
// 度數,正/反轉,速度控制
delay(unsigned char x) //延時
{
unsigned char i;
for( i=0;i<x;i++);
}
main()
{
TMOD=0x01; //定時器初始化
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(P0_0==0) //判斷正轉按鍵是否按下
{
delay(5);
if(P0_0==0) flag=0; //判斷是否真正按下
}
if(P0_1==0) //判斷反轉按鍵是否按下
{
delay(5);
if(P0_1==0) flag=1; //判斷是否真正按下
}
}
}
void motor() interrupt 1
{
t++; //控制速度
if(t==8)
{
t=0;
P1=codes[flag][counts]; //轉動
counts++;
if (counts==8) counts=0; //角度重置
}
TF0=0; //重新計時
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
}
『陸』 如何用C語言控制步進電機 正轉後自動反轉
中斷2,啟動-停止切換(通過切換flag_status),顯示狀態。do-while是延時。
中斷1,計數器count增1,如果達到預設的數值tab[sp],計數器歸零,標志flag置1。這個好像與速度有關。通過調整延時時間來調整速度。
中斷0,讀鍵盤。沒有scan_key()的源代碼,不知道裡面有些什麼操作。
while(1){...}循環是電機運轉,flag_status是狀態,1轉動,0停止。
沒有看到與正轉反轉有關的代碼。也許在motor_cw_ccw();函數裡面,這個就是電機動一下的函數。
原程序不完整,沒有相應函數、變數的定義及意義說明。難以確切理解。
『柒』 關於51單片機控制步進電機編程(c語言),求助
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharkey_l,key,i;
ucharcodetemp1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
ucharcodetemp2[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
ucharcodeaa[16]=":";
ucharcodesmg[]="";
sbite=P2^6;
sbitrs=P2^4;
sbitrw=P2^5;
voiddelay(inttt)
{
while(tt--);
}
voidw_cmd(uchardd)
{
rs=0;
rw=0;
e=0;
delay(50);
P0=dd;
e=1;
delay(50);
e=0;
delay(50);
}
voidw_dat(uchardd)
{
rs=1;
rw=0;
e=0;
delay(50);
P0=dd;
e=1;
delay(50);
e=0;
}
voidinit(ucharsmg4[],uchartime[])
{
w_cmd(0x38);
delay(2000);
w_cmd(0x38);
delay(500);
w_cmd(0x38);//注意順序,設置工作方式,顯示模式設置
delay(500);
w_cmd(0x08);//注意順序,關閉顯示
w_cmd(0x01);//清屏
w_cmd(0x07);//游標·畫面滾動模式設置
w_cmd(0x0c);//顯示及游標模式設置
w_cmd(0x80);//
for(i=0;i<16;i++)
w_dat(time[i]);
w_cmd(0x80+0X40);
for(i=0;i<16;i++)
w_dat(smg4[i]);
}
voidTb(ucharsmg[],ucharn,uchars,ucharl,uchard)
{
unsignedcharm;
w_cmd(0x82);
for(m=n;m<s;m++)
w_dat(smg[m]);
w_cmd(0x80+0X42);
for(m=l;m<d;m++)
w_dat(smg[m]);
}
voidmain()
{
init(aa,aa);
while(1)
{
P1=0xf0;
key_l=P1;
if(key_l!=0xf0)
{
delay(100);
if(key_l!=0xf0)
{
P1=key_l|0x0f;
key=P1;
}
}
switch(key)
{
case0xee:Tb(smg,0,10,11,21);
for(i=0;i<8;i++)
{
P2=temp1[i];
delay(500);
}
break;
case0xde:Tb(smg,0,10,19,29);
for(i=0;i<8;i++)
{
P2=temp1[i];
delay(300);
}
break;
case0xbe:Tb(smg,0,10,30,40);
for(i=0;i<8;i++)
{
P2=temp1[i];
delay(100);
}
break;
case0x7e:P2=0xff;Tb(smg,0,10,39,49);break;
case0xed:Tb(smg,50,60,11,21);
for(i=0;i<8;i++)
{
P2=temp2[i];
delay(200);
}
break;
case0xdd:Tb(smg,50,60,19,29);
for(i=0;i<8;i++)
{
P2=temp2[i];
delay(120);
}
break;
case0xbd:P2=0xff;Tb(smg,50,60,40,50);break;
}
}
}
『捌』 求單片機控制步進電機的C語言程序,急啊
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1 = P3^2; //步進電機逆時針方向轉
sbit KEY2 = P3^3; //步進電機順時針方向轉
sbit KEY3 = P3^4; //步進電機調速
uchar step = 0;
bit AB_flag = 0;
unsigned char code A_Rotation[8]={0x08,0x18,0x10,0x30,0x20,0x60,0x40,0x48}; //順時針轉表格
unsigned char code B_Rotation[8]={0x48,0x40,0x60,0x20,0x30,0x10,0x18,0x08}; //逆時針轉表格
/********************************************************************
* 名稱 : Delay_1ms()
* 功能 : 延時子程序,延時時間為 1ms * x
* 輸入 : x (延時一毫秒的個數)
* 輸出 : 無
***********************************************************************/
void Delay(uint i)
{
uchar x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
void KEY(void)
{
if(KEY1 == 0) //按P3.2,實現步進電機的逆時針轉動
{
Delay(15);
if(KEY1 == 0)
{
while(1)
{
if(KEY1 == 1)
{
Delay(15);
if(KEY1 == 1)
{
AB_flag = 0;
break;
}
}
}
}
}
if(KEY2 == 0) //按P3.3,實現步進電機的順時針轉動
{
Delay(15);
if(KEY2 == 0)
{
while(1)
{
if(KEY2 == 1)
{
Delay(15);
if(KEY2 == 1)
{
AB_flag = 1;
break;
}
}
}
}
}
if(KEY3 == 0) //按P3.4,實現步進電機的調速
{
Delay(15);
if(KEY3 == 0)
{
while(1)
{
if(KEY3 == 1)
{
Delay(15);
if(KEY3 == 1)
{
step++;
if(step == 3)
{
step = 0;
}
break;
}
}
}
}
}
}
main()
{
uchar i;
while(1)
{
KEY(); //按鍵處理函數
for(i=0;i<8;i++) //因為有8路的控制時序
{
if(AB_flag == 0)
{
P1 = A_Rotation[i]; //逆時針轉動
}
else
{
P1 = B_Rotation[i]; //順時針轉動
}
Delay(2+step); //改變這個參數可以調整電機轉速
}
}
}
『玖』 步進電機的單片機控制之C語言編程
步進電機有一個重要參數要矩頻特性。也就是頻率和力矩的關系。頻率高力矩就會低。42系列步進電機600HZ的頻是比較合適的。頻率再高的話力矩會下降。還有就是你說的5V變成12V這個問題。我們也遇到過。原因是步進電機是感性的。當電壓高時電流的變化會很快。而電感會阻礙電流的快速上升。當你的電機頻率比較高時,電流還沒有達到額定電流時就換相了。有什麼問題找我QQ:654790769.我們正在為學校設計機器人,明年參加省里的比賽。