步进电机代码
1. 单片机步进电机的,就是那个控制正转反转的代码怎么来的
数据高四位不动,低四位在变动,是四相电机(A,B,C,D四相),由第一组代码1110-1100-1101-1001-1011-0011-0111-0110,0的个数分别是1-2-1-2-1-2-1-2,所以是1-2相励磁方式,可以看出是低电平励磁,电机应该是几相几线,如果是低电平直接接到相的一端励磁,那么这个线应该是接了高电平,这样才能导通,也有一种可能是线接了低电平,而相通过一个ULN2003接至IO口由于ULN2003不仅有放大电流的作用还会反向,所以单片机给0时,经过反向是高电平接到相的一端,而线此时是低电平的话,则导通,起到励磁作用。。要说明的是这里的四相不一定是结构上真有四个相,也许只有两绕组,两相,但是你从没各绕组中间各引出一条线接在一起,接到VCC上,这样也相当于四个相,即四相五线接法,此时就是刚才提到的单片机的那种接法
2. 控制步进电机c语言代码解释
sbit p00 = P0^0; //定义引脚,方便使用
sbit p01 = P0^1;
sbit p02 = P0^2;
unsigned char code Forward[4]={0xFC,0xF9,0xF3,0xF6};//正转表格
unsigned char code Return[8]={0xF7,0xF3,0xFB,0xF9,0xFD,0xFC,0xFE,0xF6};//反转表格
void delay(unsigned int i)//延时
{
while(--i);
}
/*******************************************************************************
** 步进电机正转 P0口的第三口,P0^2
********************************************************************************/
void turnfor(void)
{
unsigned char i;
while(1) //进入工作状态
{
if(p01 == 0) //检测端口状态
{
delay(1000); //延时1000个单位
if(p01 == 0) //如果端口还是那个状态
break; //退出if()
}
if(p01 == 0)
{
if(p01 == 0)
break;
}
for(i = 0; i < 4; i++)
{
P1 = Forward[i];
delay(2000);
}
}
}
/*******************************************************************************
** 步进电机反转 P0口的第二口,P0^1
********************************************************************************/
void retur(void)
{
unsigned char i;
while(1)
{
if(p00 == 0)
{
delay(1000);
if(p00 == 0)
break;
}
if(p02 == 0)
{
if(p02 == 0)
break;
}
for(i = 0; i < 8; i++)
{
P1 = Return[i];
delay(2000);
}
}
}
/*******************************************************************************
** 步进电机停止转动 P0口的第一口,P0^0
********************************************************************************/
void stop(void)
{
while(1)
{
if(p01 == 0)
{
delay(1000);
if(p01 == 0)
break;
}
if(p02 == 0)
{
if(p02 == 0)
break;
}
P1 = 0xFF;
delay(300);
}
}
/*******************************************************************************
** 步进电机转动主函数
********************************************************************************/
void Main(void)
{
stop();
while(1)
{
if(p00 == 0)
{
delay(1000);
if(p00 == 0)
stop();
}
if(p01 == 0)
{
delay(1000);
if(p01 == 0)
retur();
}
if(p02 == 0)
{
delay(1000);
if(p02 == 0)
turnfor();
}
}
}
//不好意思,你这个程序好像有问题,我无法帮你解译了,呵呵
//严重的问题出现在:如果进入了正转,就出不来了
3. 求单片机控制步进电机简单的c程序
几相的步进电机啊?用不用驱动芯片?用的话选什么型号的驱动芯片?你要说具体点啊!
先给你三相的,个不用驱动芯片的步进电机程序。(驱动电路自己做)
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
uint
time
void
timer1(void)
interrupt
1
using
1{
//定时器0中断,定时1ms//
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
time++;
}
void
delay(uint
n){
//一般延时
while(--n);
}
void
delay(uint
dtime){
//延时
TR0=1;
while(time<=dtime);
time=0;
TR0=0;
}
void
moto(bit
cf,uchar
n,uint
dtime){
//电机驱动子程序,
uchar
idata
zhpai[4]={0x78,0xb8,0xd8,0xe8};
uchar
idata
fpai[4]={0xe8,0xd8,0xb8,0x78};
uchar
i,l=0;
if(cf==0)
//正转,A-B-C-A
for(i=0;i<n;i++){
P1=zhpai[l];//P1.7~1.4为输出口,分别为A、B、C、D
l++;
delay(dtime);
if(l==4)l=0;
}
else{
//反转,C-B-A-C
for(i=0;i<n;i++){
P1=fpai[l];
l++;
delay(dtime);
if(l==4)l=0;
}
}
}
void
main(){
TMOD=0x01;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
EA=1;
ET0=1;
while(1){
moto(0,4,70);//正转,转四相,每相间隔70ms
delay(10000);
moto(1,4,70);//反转,转四相,每相间隔70ms
delay(10000);
}
}
改为四相了,你看看吧。不懂再问吧。
4. 汇编语言控制步进电机正反转180°如何编写代码
这是8086微机原理的实验吧,我没有相同的硬件环境,只能给你说一下思路。
首先,步进电机的控制就是在两组不同的线圈上加脉冲信号,对于你提供的实验资料来说,就是向8255的B口发送相应的数据。你可以定义两个内存变量,一个正转,一个反转。当要正转时把正转变量传送给控制过程,反转时把反转变量传送给控制过程。这样就可以控制正反转了。
其次延时30秒,这可以通过做循环程序实现。自己编写一个过程就可以。
第三,写个控制程序过程,设置一个内存变量,当该变量为零时把控制电机正转,非0时,反转,调用延时程序,改变这个变量值,通过取反操作,使其值在0和1之间不断变化,电机就会按要求转动。
5. 单片机控制步进电机的程序编写
#include <REGX51.H>
#define uchar unsigned char
#define uint unsigned int
sbit s1=P3^5;
sbit s2=P3^6;
sbit s3=P3^7;
uchar keyval; void delayms(uchar z)
{
uchar i,j;
for (i=z; i>0; i++)
for(j=110;j>0; j++);
}void delay()
{
uint k;
for(k=0;k<2000;k++);
}void keyscan()
{
if((0xe0&P3)!=0xe0)
{
delayms(5);
if(s1==0)
keyval=1;
if(s2==0)
keyval=2;
if(s3==0)
keyval=3;
}
} void zheng()
{
P2=0xfc;
delayl();
P2=0xf6;
delay();
P2=0xf3;
delay();
P2=0xf9;
delay();
} void fan()
{
P2=0xfc;
delayl();
P2=0xf9;
delay();
P2=0xf3;
delay();
P2=0xf6;
delay();
} void main()
{
while(1)
{
keyscan();
switch(keyval)
{
case 1: zheng();
break;
case 2: fan();
break;
case 3: P2=0xff;
break;
}
}
}
6. 求步进电机的汇编程序
8086的,自己看一下吧
DATA SEGMENT
PORTA EQU 0200H ;8255A口
PORTB EQU 0202H ;8255B口
PORTC EQU 0204H ;8255C口
CON0 EQU 0206H ;8255控制口
PORT1 EQU 0400H ;8253计数器0
PORT2 EQU 0402H ;8253计数器1
PORT3 EQU 0404H ;8253计数器2
CON1 EQU 0406H ;8253控制口
DATA1 DB 00001100B ;正转电流
DB 00000110B
DB 00000011B
DB 00001001B
DATA2 DB 00000110B ;反转电流
DB 00001100B
DB 00001001B
DB 00000011B
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START: MOV AX,DATA ;初始化
MOV DS,AX
MOV ES,AX
MOV AX,0
MOV SS,AX
MOV SI,1000H
MOV DX,CON0 ;8255初始化
MOV AL,10001001B ;A,B,C口工作在方式0,A口输出,C口输入
OUT DX,AL
MOV DX,CON1 ;8253初始化
MOV AL,00010010B ;计数器0二进制读写低字节计数工作在方式2
OUT DX,AL
A0: MOV DX,PORTC
IN AL,DX
TEST AL,00010000B ;测试是否K1按下,是继续测试,不是则跳转
JNZ A1
JMP A0
A1: TEST AL,00100000B ;测试是否K2按下,是则跳转到反转
JZ A2
TEST AL,01000000B ;测试是否K3按下,是则跳转到正转
JZ A3
JMP A0
A2: LEA SI,DATA1 ;取使电机反转的代码地址
MOV CL,4
MOV DX,PORTA
MOV AL,01000000B
OUT DX,AL ;让灯亮
AA2: MOV AL,[SI]
OUT DX,AL ;送转动电流代码到8255A口
INC SI
DEC CL
; CALL DELAY
CMP CL,00H
JZ A0 ;转了一圈继续扫描是否有键按下
JMP AA2
A3: LEA SI,DATA2 ;取使电机正转的代码地址
MOV CL,4
MOV DX,PORTA
MOV AL,10000000B
OUT DX,AL ;让灯2亮
AA3: MOV AL,[SI]
OUT DX,AL ;送转动电流代码到8255A口
INC SI
DEC CL
; CALL DELAY
CMP CL,00H
JZ A0 ;转了一圈继续扫描是否有键按下
JMP AA3
DELAY PROC ;实现精确延时
C0: MOV DX,PORT1
MOV AL,100 ;计数初值送计数器0
OUT DX,AL
MOV DX,PORTC ;读8255的C口数据
IN AL,DX
TEST AL,10000000B
JNZ C0
RET
DELAY ENDP
CODE ENDS
END START
7. 步进电机驱动程序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;
}
8. 步进电机的程序该怎么写
我没有写过PLC的,只写过单片机的哦...你网上搜下,蛮多的,主要是理解了就好...步进嘛,就是你给它一个突变的信号,它就走一步的,不然就不叫步进撒...也就是你触发它一下,它跑一步,且只跑一步的哦...懂了吧?
内容:1、本程序用于测试4相步进电机常规驱动
2、需要用跳帽或者杜邦线把信号输出端和对应的步进电机信号输入端连接起来
3、速度不可以调节的过快,不然就没有力矩转动了
4、按s4(设置成独立按键模式)可以控制正反转
------------------------------------------------*/
#include <reg52.h>
bit Flag;//定义正反转标志位
unsigned char code F_Rotation[4]={0xf1,0xf2,0xf4,0xf8}; //正转表格
unsigned char code B_Rotation[4]={0xf8,0xf4,0xf2,0xf1}; //反转表格
/******************************************************************/
/* 延时函数 */
/******************************************************************/
void Delay(unsigned int i)//延时
{
while(--i);
}
/******************************************************************/
/* 主函数 */
/******************************************************************/
main()
{
unsigned char i;
EX1=1; //外部中断0开
IT1=1; //边沿触发
EA=1; //全局中断开
while(!Flag)
{
P0=0x71;//显示 F 标示正转
for(i=0;i<4;i++) //4相
{
P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表格
Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
while(Flag)
{
P0=0x7C;//显示 b 标示反转
for(i=0;i<4;i++) //4相
{
P1=B_Rotation[i]; //输出对应的相
Delay(500); //改变这个参数可以调整电机转速 ,数字越小,转速越大
}
}
}
/******************************************************************/
/* 中断入口函数 */
/******************************************************************/
void ISR_Key(void) interrupt 2 using 1
{
Delay(300);
Flag=!Flag; //s3按下触发一次,标志位取反
}
9. 步进电机控制程序
AT89C51单片机,步进电机驱动器L298N驱动,实现单片机识别并输出显示键盘输入的数据信息(转角)并产生连续脉冲控制步进电机转动,电机型号是两相步进电动机42BYG121,其步进角为1.8度,通过半步驱动方式进行细分可获得0.9度的步进角;环形分配器和电机驱动器...
控制器接收到上位机的命令后,首先获取需要转动的步数,然后根据相应命令打开相应定时器的计数功能。控制程序中用定时器1控制二路脉冲输出,定时器2控制一路脉冲输出,从而完成3路电机的控制。 定时器2使用CTC模式,匹配中断使能。通过匹配中断,在OCR2端口可以输出脉冲,通过设定寄存器OCR2寄存器的值可以改变输山脉冲频率。定时器1使用相位与频率修正模式...
键则反向转1~9圈;左键固定正转90度,右键固定反转90;Esc 键终止转动。通过这个程序,我们也可以进一步体会到如何用按键来控制程序完成复杂的功能,以及控制和执行模块之间如何协调工作,而你的编程水平也可以在这样的实践练习中得到锻炼和提升。#include<reg52.h> sbitKEY_IN_1=P2...