C语言实现控制电机加减速正反转(飞思卡尔C代码)

合集下载

pwm控制电机C程序

pwm控制电机C程序
}
else
{
PWM=1;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
}
}
}
void Timer1() interrupt 3
{
TH1=0x4c;
TL1=0x00;
Tcount++;
if(Tcount==20)
{
Tcount=0;
now=a;
i++;
if(i==10)
key_scan();
change();
}
}
基于89C51的pwm
#include "reg52.h"
#include "intrins.h"
#define uc unsigned char
uc deasil;//顺时针
uc widdershins;//逆时针
uc start,up; //停止
uc key_value,a,Tcount,temp;
samp=a;
if(i>100)
i=90;
a=0;
}
}
void exter() interrupt 0
{
a++;
}
//***********键盘扫描****************************
//函数名称:void Timer0() interrupt 1 using 1
//函数功能:计时
{
P2=temp;//送列扫描码
if((P2&0xf0)!=00xf0;//得出行编码
line=i-1;//计算出列值
break;

c语言实现单片机控制步进电机加减速源程序

c语言实现单片机控制步进电机加减速源程序

C 语言实现单片机控制步进电机加减速源程序1. 引言在现代工业控制系统中,步进电机作为一种常见的执行元件,广泛应用于各种自动化设备中。

而作为一种常见的嵌入式软件开发语言,C 语言在单片机控制步进电机的加减速过程中具有重要的作用。

本文将从单片机控制步进电机的加减速原理入手,结合 C 语言的编程技巧,介绍如何实现单片机控制步进电机的加减速源程序。

2. 单片机控制步进电机的加减速原理步进电机是一种能够精确控制角度的电机,它通过控制每个步骤的脉冲数来实现旋转。

在单片机控制步进电机的加减速过程中,需要考虑步进电机的加速阶段、匀速阶段和减速阶段。

在加速阶段,需要逐渐增加脉冲的频率,使步进电机的转速逐渐增加;在匀速阶段,需要保持恒定的脉冲频率,使步进电机以匀速旋转;在减速阶段,需要逐渐减小脉冲的频率,使步进电机的转速逐渐减小。

这一过程需要通过单片机的定时器和输出控制来实现。

3. C 语言实现步进电机加减速的源程序在 C 语言中,可以通过操作单片机的 GPIO 来控制步进电机的旋转。

在编写源程序时,需要使用单片机的定时器模块来生成脉冲信号,以控制步进电机的旋转角度和速度。

以下是一个简单的 C 语言源程序,用于实现步进电机的加减速控制:```c#include <reg52.h>void main() {// 初始化定时器// 设置脉冲频率,控制步进电机的加减速过程// 控制步进电机的方向// 控制步进电机的启停}```4. 总结与回顾通过本文的介绍,我们了解了单片机控制步进电机的加减速原理和 C 语言实现步进电机加减速源程序的基本思路。

掌握这些知识之后,我们可以更灵活地应用在实际的嵌入式系统开发中。

在实际项目中,我们还可以根据具体的步进电机型号和控制要求,进一步优化 C 语言源程序,实现更加精准和稳定的步进电机控制。

希望本文能为读者在单片机控制步进电机方面的学习和应用提供一定的帮助。

5. 个人观点与理解在我看来,掌握 C 语言实现单片机控制步进电机加减速源程序的技术是非常重要的。

步进电机控制(单片机C语言)

步进电机控制(单片机C语言)

步进电机控制(单⽚机C语⾔)模块⼆简单应⽤实例调试任务2 步进电机控制(H22)⼀、任务要求⽤单⽚机P1端⼝控制步进电机,编写程序输出脉冲序列到P1⼝,控制步进电机正转、反转,加速,减速。

⼆、任务⽬的1.了解步进电机控制的基本原理。

2.掌握控制步进电机转动的编程⽅法。

三、电路连线框图步进电机电流⼩于0.5A时可采⽤ULN2003A进⾏驱动(反相)四、原理控制说明步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进式旋转。

切换是通过单⽚机输出脉冲信号来实现的。

所以调节脉冲信号的频率便可以改变步进电机的转速,改变各相脉冲的先后顺序,可以改变电机的旋转⽅向。

步进电机的转速应由慢到快逐步加速。

电机驱动⽅式可以采⽤双四拍(AB→BC→CD→DA→AB)⽅式,也可以采⽤单四拍(A→B→C→D→A)⽅式,或单、双⼋拍(A→AB→B→BC→C→CD→D→DA→A)⽅式。

控制时公共端是接在VCC上的,所以实际控制脉冲是低电平有效。

单⽚机的P1⼝输出的脉冲信号经(MC1413或ULN2003A)倒相驱动后,向步进电机输出脉冲信号序列。

五、程序框图# include#define Astep 0x01#define Bstep 0x02#define Cstep 0x04#define Dstep 0x08unsigned char dly_c;void delay(){unsigned char tt,cc;cc = dly_c; //外循环次数tt = 0x0; //内循环次数do{do {}while(--tt);}while(--cc);}void main(){dly_c = 0x10;// 双四拍⼯作⽅式while(1){P1= Astep+Bstep;delay();P1= Bstep+Cstep;delay();P1= Cstep+Dstep;delay();P1= Dstep+Astep;delay();if (dly_c>3) dly_c --; // 加速控制};。

C语言实现控制电机加减速正反转(飞思卡尔C代码)

C语言实现控制电机加减速正反转(飞思卡尔C代码)

C语言实现控制电机加减速正反转(飞思卡尔C代码)用单片机控制直流电动机的正反转、加减速的程序如何用C语言写参考一下这个例子吧。

#include#define uchar unsigned char#define uint unsigned intsbit PW1=P2^0 ;sbit PW2=P2^1 ; //控制电机的两个输入sbit accelerate=P2^2 ; //调速按键sbit stop=P2^3 ; //停止按键sbit left=P2^4 ; //左转按键sbit right=P2^5 ; //右转按键#define right_turn PW1=0;PW2=1 //顺时针转动#define left_turn PW1=1;PW2=0 //逆向转动#define end_turn PW1=1;PW2=1 //停转uint t0=25000,t1=25000; //初始时占空比为50%uint a=25000; // 设置定时器装载初值25ms 设定频率为20Hz uchar flag=1; //此标志用于选择不同的装载初值uchardflag; //左右转标志uchar count; //用来标志速度档位void keyscan(); //键盘扫描void delay(uchar z);void time_init(); //定时器的初始化void adjust_speed(); //通过调整占空比来调整速度//**********************************//void main(){time_init(); //定时器的初始化while(1){keyscan(); //不断扫描键盘程序,以便及时作出相应的响应}}//*************************************//void timer0() interrupt 1 using 0{if(flag){flag=0;end_turn;a=t0; //t0的大小决定着低电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}else{flag=1; //这个标志起到交替输出高低电平的作用if(dflag==0){right_turn; //右转}else{left_turn; //左转}a=t1; //t1的大小决定着高电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}}voidtime_init(){TMOD=0x01; //工作方式寄存器软件起动定时器定时器功能方式1 定时器0TH0=(65536-a)/256;TL0=(65536-a)%256; //装载初值ET0=1; //开启定时器中断使能EA=1; // 开启总中断TR0=0;}//****************************************//void delay(uchar z) //在12M下延时z毫秒{uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//******************************// voidkeyscan(){if(stop==0){TR0=0; //关闭定时器0 即可停止转动end_turn;}if(left==0){TR0=1;dflag=1; //转向标志置位则左转}if(right==0){TR0=1;dflag=0; //转向标志复位则右转}if(accelerate==0){delay(5) ; //延时消抖if(accelerate==0){while(accelerate==0) ; //等待松手count++;if(count==1){t0=20000;t1=30000; //占空比为百分之60 }if(count==2){t0=15000;t1=35000; //占空比为百分之70 }if(count==3){t0=10000;t1=40000; //占空比为百分之80 }if(count==4){t0=5000;t1=45000; //占空比为百分之90}if(count==5){count=0;}}}}功能特点:1)总线速度高达40 M Hz,CAN总线:3个1Mbps的CAN总线,兼容CAN2.0 A/B;2)128 KB程序Flash和8 KB DataFlash,用于实现程序和数据存储,均带有错误校正码(E CC);3)可配置A/D:16通道模数转换器;可选8位10位和12位精度,3μs的转换时间4)内嵌MS CAN模块用于CAN节点应用,内嵌支持LIN协议的增强型SIC模块和SPI模块;5)4通道16位计数器,CRG时钟和复位发生器:锁相环、看门狗、实时中断;增强型捕捉定时器;6)出色的低功耗特性,带有中断唤醒功能的10,实现唤醒休眠系统的功能;7)通道PWM:8位8通道或16位4通道PWM,易于实现电机控制。

控制电机的c语言程序

控制电机的c语言程序
}
//水位5
if(shuiman==1&&sw5==0&&sw4==1&&sw3==1&&sw2==1&&sw1==1)//当唯一的闭合一个传感器单元:水位5时发生
{
P0=table[5];//显示水位深度:5
}
//水位4
if(shuiman==1&&sw5==1&&sw4==0&&sw3==1&&sw2==1&&sw1==1)//当唯一的闭合一个传感器单元:水位4时发生
#include<reg51.h>
//定义一个数组,使数码管显示的数字和数组元素的下标相等
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
sbit shuiman=P1^0;//水满
sbit sw5=P1^1;//水位5
{
P0=table[2];//显示水位深度:2
}
//水位低
if(shuiman==1&&sw5==1&&sw4==1&&sw3==1&&sw2==1&&sw1==0)//当唯一的闭合一个传感器单元:水位1时发生
{
dianji=0;//开电机
state=0;//电机工作指示灯打开
P0=table[1];//显示水位深度:1
}
//手工上水
if(shougong==0)//当按手工上水按钮时发生
{
dianji=0;//开电机

单片机控制步进电机系统(C语言源代码)

单片机控制步进电机系统(C语言源代码)

说明: 本系统中采用了四个按键,分别与 80s52 的四个引脚相连,分别为 LCDEN,RS,WR,RD;
分别实现的功能是电机加速,减速,正反转。键盘一旦按下则表示向单片机发送了有效信号, 单片机就相应的进行调节。对于键盘的键按下的时候分为几个步骤,当键盘按下的时候,接 通电路,键盘扫描检测低电平,但检测到低电平之后不能够判断键是否被按下,因为抖动可 能引起这个变化,所有大概延时 5~10ms 之后再进行检测。如果再次检测到低电平之后说明 键被按下。这个过程就是所说的消除抖动。 3.3 显示部分 如图 5
Key Words:SCM; stepper motor; system; drive
目录
引言 4 1 单片机控制步进电机的一般原理 4 1.1 步进电机 4
1.1.1 步进电机介绍 4 1.1.2 步进电机分类 5 1.1.3 技术指标 5 1.1.4 步进电机工作原理 5 1.2 单片机 7 2 步进电机驱动实现 8 2.1 简介 8 2.2 驱动选择 8 3 系统硬件设计 9 3. 1 单片机控制电机 9 3.2 键盘 9 3.3 显示部分 10 程序流程图 11 总结 12 致 谢 13 参考文献 13 附录 13 C 代码 13
In this paper, given the design of the system hardware circuit,software design, human-computer interaction and so on.and it given the details description of each functional module.the main contents include the following:
功能特性描述

C语言程序-直流电机调速

C语言程序-直流电机调速

C语言程序-直流电机调速(总5页)-CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除#include<>#define uchar unsigned char#define uint unsigned int/* 端口定义*/sbit in1=P1^0;sbit in2=P1^1;sbit jian=P2^0;sbit jia=P2^1;sbit dir=P2^2;sbit run=P2^3;sbit inter_0=P3^2;sbit inter_1=P3^3;#define LCD_data P0 //数据口sbit LCD_RS = P2^7; //寄存器选择输入sbit LCD_RW = P2^6; //液晶读/写控制sbit LCD_EN = P2^5; //液晶使能控制sbit LCD_PSB = P2^4; //串/并方式控制uchar t10,t1,ce,cj,s1=0,pl=10;uchar zi[]={"电机转速:"};uchar num[3];uint nums=0,speed,k=1200;void delay_1ms(uchar x){uchar i,j;for(j=0;j<x;j++)for(i=0;i<110;i++);}/*******************************************************************/ /* *//*写指令数据到LCD *//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。

*/ /* *//*******************************************************************/ void write_cmd(uchar cmd){LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;P0 = cmd;delay_1ms(5);LCD_EN = 1;delay_1ms(5);LCD_EN = 0;}/*******************************************************************/ /* *//*写显示数据到LCD *//*RS=H,RW=L,E=高脉冲,D0-D7=数据。

51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位显示)

51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位显示)

51单片机实现三相六拍的步进电机控制(正反转、加减速、挡位显示)自己写的,不规范还望包含,keil和protues文件单片机源程序如下:1.#include <reg52.h>2.3.#define uchar unsigned char4.#define uint unsigned int5.uint speed = 100; //初始转速6.uint max = 200; //最慢转速7.uint min = 20; //最快转速8.9.sbit swich = P2^0; //总开关10.sbit dir = P2^1; //电机旋转方向11.sbit le1=P2^6;12.sbit le2=P2^7;13.sbit speedadd=P3^2;14.sbit speedsub=P3^3;15.16.unsigned char uca_MotorStep[]={0x01,0x03,0x02,0x06, 0x04,0x0C,0x08,0x09}; //励磁电流数组。

17.18.19.uchar leddata[]={20.21.0x3F, //"0"22.0x06, //"1"23.0x5B, //"2"24.0x4F, //"3"25.0x66, //"4"26.0x6D, //"5"27.0x7D, //"6"28.0x07, //"7"29.0x7F, //"8"30.0x6F, //"9"31.0x40, //"-"32.0x00, //熄灭33.};34.35.36.void delay1ms(void) //误差 0us37.{38.unsigned char a,b,c;39.for(c=1;c>0;c--)40.for(b=142;b>0;b--)41.for(a=2;a>0;a--);42.}43.44.void delay(uint x ) //多功能毫秒延时45.{46.uint i;47.for(i=0;i<x;i++)48.{49.delay1ms();50.}51.}52.53.54.55.void display(void)56.{57.if(swich==1)58.{59.P0= leddata[11];60.delay(1);61.le2=1;62.le1=1;63.delay(1);64.le2=0;65.le1=0;66.67.}68.else69.{70.if(dir==1)71.{72.P0= leddata[11];73.delay(1);74.le2=1;75.delay(1);76.le2=0;77.}78.else79.{80.P0 =leddata[10];81.delay(1);82.le2=1;83.delay(1);84.le2=0;85.}86.87.P0=leddata[9-(speed-20)/20];88.delay(30);89.le1=1;90.delay(5);91.le1=0;92.93.}94.}95.96.97.void Init_INT0()98.{99.EX0=1; //开启外部中断 0100.IT0=1; //设置成低电平触发,1为下降沿触发101.EX1=1; //开启外部中断 1102.IT1=1; //设置成低电平触发,1为下降沿触发103.EA=1; //开启总中断104.}105.106.void Interrupt0_handler() interrupt 0107.{108.EA=0; //首先关闭总中断,以消除按键出现的抖动所产生的干扰109.delay(20); //同样是为了消除抖动而产生新的中断110.if(speed>min)111.{speed=speed-20;} //限制最快转速112.else113.{speed=min;}114.while(speedadd==0);115.EA=1; //恢复中断116.}117.118.119.void Interrupt1_handler() interrupt 2120.{121.EA=0; //首先关闭总中断,以消除按键出现的抖动所产生的干扰122.delay(20); //同样是为了消除抖动而产生新的中断123.if(speed<max)124.{speed=speed+20;}125.else126.{speed=max;} //限制最慢转速127.while(speedsub==0);128.EA=1; //恢复中断130.131.void main()132.{133.int i; //初始化134.dir=1;135.le1=0;136.le2=0;137.138.139.start:140.if(swich==0)141.{Init_INT0();} //总开关开启,初始化中断,开始转动142.else143.{display(); goto start; }144.145.146.if(dir==1)147.seq:148.{149.while(1)150.{151.display();152.for (i=0; i<8; i++)153.{154.P1 = uca_MotorStep[i]; //取数据155.delay(speed); //调节转速156.}157.if(dir==0) //是否换向159.delay(5); // 换向延时160.goto oppo; //换向161.}162.if(swich==1) //总开关运行中关闭163.goto start; //等待开启164.165.}166.167.}168.else169.oppo:。

AT80C52的PWM控制电机正转 反转 加速 减速

AT80C52的PWM控制电机正转 反转 加速 减速

PWM调速电机正反转加速停止/********************************************************************* *本实验是基于普中科技的开发板设计直流电动机PWM调速实验。

*设计要求:k1控制电机正转,k2控制电机反转,k3控制电机加*速,k4控制电机减速,k5控制电机停止。

数码管显示电机转向,*速度和所转圈数。

并将速度发送到上位机。

实验所用电机为12V*自带增量式光电编码器。

外部中断0触发方式为高电平触发方式效果更好。

**********************************************************************/ #include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit BRA=P2^5; // 刹车sbit DIR=P2^6; // 转向sbit PWM=P2^7; // 调速sbit k1=P1^0; //正转sbit k2=P1^1; //反转sbit k3=P1^2; //加速sbit k4=P1^3; //减速sbit k5=P1^4; //停止sbit ls138a=P2^2;sbit ls138b=P2^3;sbit ls138c=P2^4;uchar flag; //方向标志位uchar speed=50; //初始转速uint quan_num; //圈数uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,// 0 1 2 3 40x6d,0x7d,0x07,0x7f,0x6f,0x40};// 5 6 7 8 9 -void delay(uint x){uchar i;while(x--){for(i=0;i<110;i++);}}/***************************************************************** 名称:init()* 功能:初始化函数,设置串口,定时器0,定时器1* 输入:无* 输出:无****************************************************************/void init(){SCON=0x50;//允许串接收发送TMOD=0x21;//定时器1工作在模式2,为串口提供波特率;定时器0工作在模式1,产生PWM波TH0=0xff; //定时100usTL0=0xa4;TH1=0xfd;//波特率为9600TL1=0xfd;IT0=1; //IT0=0低电平触发,IT0=1下降沿触发TR0=1; //开定时器0TR1=1; //开定时器1ET0=1; //开定时器0中断EA=1; //开总中断}/***************************************************************** 名称:display()* 功能:显示子函数,显示圈数,转速和转向* 输入:圈数,转速,转向* 输出:无****************************************************************/void display_sum(uint num) //圈数显示{P0=table[num%1000/100]; //显示圈数百位ls138a=1;ls138b=0;ls138c=1;delay(1);P0=table[num%100/10]; //显示圈数十位ls138a=0;ls138b=1;ls138c=1;delay(1);P0=table[num%10]; //显示圈数个位ls138a=1;ls138b=1;ls138c=1;delay(1);}void display_speed(uchar num) //转速显示{P0=table[num%100/10]; //显示转速十位ls138a=1;ls138b=1;ls138c=0;delay(1);P0=table[num%10]; //显示转速个位ls138a=0;ls138b=0;ls138c=1;delay(1);}void display_dir(uchar num) //方向显示{P0=table[num];ls138a=0;ls138b=1;ls138c=0;delay(1);}/**************************************************************** * 名称:dispose()* 功能:正反转加减速子函数* 输入:无* 输出:无****************************************************************/ void dispose() //按键处理{if(k5==0) //停止{EX0=0; //关外部中断0BRA=1; //刹车}if(k1==0) //正转{EX0=1; //开外部中断0BRA=0; //关刹车DIR=1; //电机正转PWM=1; //开电机flag=0; //电机正转标志}while(k1==0);if(k2==0) //反转{EX0=1; //开外部中断0BRA=0; //关刹车DIR=0; //电机反转PWM=1; //开电机flag=1; //电机反转标志}while(k2==0);if((k3==0)&&(speed<=90)) //加速{delay(100);if((k3==0)&&(speed<=90))EX0=1; //开外部中断0{speed=speed+10;}}while(k3==0);if((k4==0)&&(speed>=10)) //减速{delay(100); //延时去抖if((k4==0)&&(speed>=10))EX0=1; //开外部中断0{speed=speed-10;}if(speed==0)EX0=0; //如果速度为0,关外部中断0 }while(k4==0); //等待按键松开}void main(){init();PWM=0;P3=0xff;while(1){dispose(); //按键处理display_speed(speed); //显示速度display_sum(quan_num); //显示圈数display_dir(flag); //显示转向ES=0; //关串口SBUF=quan_num; //送圈数SBUF=speed; //送速度SBUF=flag; //送方向标志位ES=1; //开串口}}/**************************************************************** * 名称:timer0()* 功能:定时器0子函数,产生PWM波* 输入:无* 输出:无****************************************************************/ void timer0()interrupt 1 //PWM频率为1/(100us*100)=10k Hz{uchar count;TH0=0xff; //100usTL0=0xa4;if(count==speed){PWM=0; //关电}count++;if(count==100){count=0;if(speed!=0)//如果时间是0,保持原来状态PWM=1; //开电}}/**************************************************************** * 名称:int0()* 功能:外部中断0子函数* 输入:脉冲* 输出:电机旋转圈数****************************************************************/ void int0() interrupt 0{uint a;if(++a>=5120) //记每圈的脉冲数{a=0;quan_num++;if(quan_num>=999){quan_num=0;}}}/**************************************************************** * 名称:sever()* 功能:串口子函数* 输入:无* 输出:无****************************************************************/ void sever() interrupt 4 //串口中断{TI=0;}。

步进电机调速控制系统设计C语言程序及说明

步进电机调速控制系统设计C语言程序及说明

步进电机调速控制系统设计C语言程序及说明使用元器件:单片机8051、步进电机17H185H-04A、128细分/3.0A步进电机驱动器、LED显示器。

实现控制功能:以8051单片机为控制器,系统设四个按键:“工作/停止按键"、“加速按键”、“减速按键”、“正反向控制按键”。

系统上电后,按下“正反向控制按键",控制电机正反转;每按一次“加速按键”后,步进电机由低向高加速一级,每按一次“减速按键”后,由高向低减速一级;按“工作/停止按键"后,电机停止转动,系统回到等待状态。

同时需要显示运行状态和转速(以实际转速或等级表示).程序清单及说明#include<reg52。

h>sbit EN=P2^0; //使能输出sbit DIR=P2^1; //方向控制sbit PWM=P2^2;//PWM输出sbit zled=P2^6;//正转信号灯sbit fled=P2^7;//反转信号灯sbit sw1=P0^0;//启停按钮sbit sw2=P0^1;//正反转按钮sbit sw3=P0^2;//加速按钮sbit sw4=P0^3;//减速按钮unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};unsigned char i,j,k,temp=0,zkb=5,zkb1=0,speed=0;void delay()//延时10ms{for(i=20;i>0;i--)for(j=248;j〉0;j--);}void InitTimer0(void) //T0定时器初始化{TMOD = 0x00; //设置定时器方式0TH0 = 0xef;//高8位送初值TL0 = 0xdd; //低8位送初值EA = 1; //开中断总允许ET0 = 1;//开T0中断允许TR0 = 1; //启动T0开始定时}void main() //主程序{InitTimer0();EN=1; //初始使能端输出0DIR=1;//方向端输出1zled=0;//正传信号灯端口输出0,灯亮fled=1;//反转信号灯输出1,灯不亮while(1){P1=table[speed];//启停if(sw1==0)//判断启停键按下{delay(); //调用延时程序if(sw1==0)//再判断,启停键按下{while(sw1==0);//启停键按下,使能端取反EN=~EN;}}//正反转子程序if(sw2==0) //判断换向键是否按下{delay();if(sw2==0){while(sw2==0);DIR=~DIR; //换向键按下,方向端口取反fled=~fled; //正传指示灯控制端取反zled=~zled;//反转传指示灯控制端取反}}//加速子程序if(sw3==0) //判断加速键是否按下{delay();if(sw3==0){while(sw3==0); //加速键按下if(speed>=5)//判断转速是否大于5 speed=5; //大于5,保持5级转速elsespeed++;//小于5,加速一级}}//减速子程序if(sw4==0) //判断减速键是否按下{delay();if(sw4==0){while(sw4==0);//减速键按下if(speed==1) //转速为1,保持1级转速speed=1;elsespeed—-; //转速不为1,减速1级}}}}void Timer0Interrupt(void) interrupt 1switch(speed)//加减速按键按下,对应选择T0初值,进入终端产生不同频率脉冲{case 1:TH0=0XDD;break;case 2:TH0=0XE1;break;case 3:TH0=0XE5;break;case 4:TH0=0XEa;break;case 5:TH0=0xf0;break;}TL0 = 0xdd;if(zkb1〉=10)zkb1=0;zkb1++;if(zkb1〈=5)PWM=1;elsePWM=0;}。

控制直流电机加减速

控制直流电机加减速

//加速处理
{
key_up_flag=0;
//清零加速标志位
high_time++; //高电平时间加1
if(high_time>=9) high_time=9; //控制 high_time,low_time 在1~9之间变化
low_time=10-high_time;
}Байду номын сангаас
if(key_down_flag==1)
while(!key_switch); //松手检测 key_switch_flag=1; //正反转标志位置"1" }
} }
/************************按键处理***************************/
void key_process()
{
if(key_up_flag==1)
//定义加速,减速,正反转标志位
/*********************ms 延时函数**********************/ void delay_ms(uint ms) {
uchar n; while(ms--) for(n=0;n<123;n++); }
/**********************按键扫描*************************/
//减速处理
{ key_down_flag=0;
//清零减速标志位
low_time++; //低电平时间加1
if(low_time>=9)
low_time=9;
high_time=10-low_time;
}
if(key_switch_flag==1) //正,反转处理

L298控制直流电机加减速的89c51单片机C程序

L298控制直流电机加减速的89c51单片机C程序

L298控制直流电机加减速的89c51单片机C程序#include<reg51.h>#include<math.h>#define uchar unsigned char#define uint unsigned intsbit en1=P3^0; /* L298的Enable A */sbit s1=P3^2; /* L298的Input 1 */sbit s2=P3^3; /* L298的Input 2 */uchar t=0; /* 中断计数器*/uchar m1=0; /* 电机1速度值*/uchar tmp1; /* 电机当前速度值*//* 电机控制函数index-电机号(1,2); speed-电机速度(-100—100) */ void motor(uchar index, char speed){if(speed>=-100 && speed<=100){if(index==1) /* 电机1的处理*/{m1=abs(speed); /* 取速度的绝对值*/if(speed<0) /* 速度值为负则反转*/{s1=0;s2=1;}else /* 不为负数则正转*/{s1=1;s2=0;}}}}void delay(uint j) /* 简易延时函数*/{for(j;j>0;j--);}void main(){uchar i;TMOD=0x02; /* 设定T0的工作模式为2 */TH0=0x9B; /* 装入定时器的初值*/TL0=0x9B;EA=1; /* 开中断*/ET0=1; /* 定时器0允许中断*/TR0=1; /* 启动定时器0 */while(1) /* 电机实际控制演示*/{for(i=0;i<=100;i++) /* 正转加速*/{motor(1,i);delay(5000);}for(i=100;i>0;i--) /* 正转减速*/{motor(1,i);delay(5000);}for(i=0;i<=100;i++) /* 反转加速*/{motor(1,-i);delay(5000);}for(i=100;i>0;i--) /* 反转减速*/{motor(1,-i);delay(5000);}}}void timer0() interrupt 1 /* T0中断服务程序*/{if(t==0) /* 1个PWM周期完成后才会接受新数值*/{tmp1=m1;}if(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号*/ t++;if(t>=100) t=0; /* 1个PWM信号由100次中断产生*/}本程序实现串口对直流电机的控制******************************************************************/#include <REG2051.H>#include <stdio.h>#define uchar unsigned char#define uint unsigned int//****************************************************************//define a status world which sended back to computer#define COMMAND_STATUS 0#define STATUS_LEFT 1#define STATUS_RIGHT 2#define STATUS_SAFETYL 4#define STATUS_SAFETYR 8#define COMMAND_LEFT 1 //Turn left#define COMMAND_RIGHT 2 //Turn right#define COMMAND_STOP 3#define COMMAND_SPEED 4#define STOP 0#define LEFT 1#define RIGHT 2#define A_OUTPUT_ENABLE P3_4 //输出使能#define B_OUTPUT_ENABLE P3_5#define MotorA 1#define MotorB 2#define motorA_r P1_7#define motorA_l P1_6#define motorB_r P1_5#define motorB_l P1_4/****************************************************************************** *全局变量定义******************************************************************************* /uchar motor, command, cmddata; /* Used to receive commands with rs232 */uchar bytenr=0; /*Used to record how many byte we will receive*/ uchar Cycle=100;uchar directionA=0; /* current rotating direction */ uchar directionB=0;uchar PWidthA=50;uchar PWidthB=50;uint speedA=0; /* Default speed */uint speedB=0;uchar ticks=0; /* counter used for speed calculation */uchar serialtimeout=0; /* used when windows crashes ;-) *//****************************************************************************** *//funtion name:void Timer0_Int (void)////******************************************************************************* /void Timer0_Int (void) interrupt 1 using 1{serialtimeout++; // Ignore all received bytes after about 2 secondsif (!serialtimeout)bytenr=0;P3_7= ~P3_7; // invert P3.7, nice for debuggingticks++;if(ticks>=Cycle)ticks=0;if(ticks<=PWidthA)A_OUTPUT_ENABLE=0;elseA_OUTPUT_ENABLE=1;switch (directionA){case STOP:{motorA_r=0;motorA_l=0;A_OUTPUT_ENABLE=0; //NPN 三极管为省电}break;case LEFT:{motorA_r=0;motorA_l=1;}break;case RIGHT:{motorA_r=1;motorA_l=0;}break;}switch (directionB){case STOP:{motorB_r=0;motorB_l=0;B_OUTPUT_ENABLE=0;}break;case LEFT:{motorB_r=0;motorB_l=1;}break;case RIGHT:{motorB_r=1;motorB_r=0;}break;}TH0 = 0xFF; // Timing 10msTH0 = 0xF0; // reload basic count numberTR0 = 1; // Enable timer 0return;}//************************************************************************** ////////***************************************************************************/ void SendChar(uchar ch){SBUF=ch;while(TI==0); //等待发送完TI=0; //中断标志复位}//************************************************************************** //函数名:void Serial_INT_SVR//////***************************************************************************void Serial_INT_SVR (void) interrupt 4 using 3{if (RI) //Did we receive data?{serialtimeout=0; //reset Timeout Counter RI=0; //reset the interrupt flagswitch (bytenr){case 0: {motor=SBUF; //receive the first byteSendChar(motor);break;}case 1: {command=SBUF;SendChar(command);break;}case 2: {cmddata=SBUF;SendChar(cmddata);break;}}bytenr++;if (bytenr > 2){bytenr=0; //reset byte counter// motor should always be zero */if(motor==MotorA){switch (command) /* command handler */{case COMMAND_STOP:{directionA=0;break;}case COMMAND_LEFT:{ //turn leftdirectionA=1;break;}case COMMAND_RIGHT:{ //tu rn rightdirectionA=2;break;}case COMMAND_SPEED:{ //改变速度speedA=cmddata;if((speedA<=Cycle)&&(speedA>1)) //保证脉宽不会太窄{PWidthA=speedA;}break;}}}else if(motor==MotorB){switch (command) /* command handler */{case COMMAND_STOP:{directionB=0;break;}case COMMAND_LEFT:{ //turn leftdirectionB=1;break;}case COMMAND_RIGHT:{ //tu rn rightdirectionB=2;break;}case COMMAND_SPEED:{ //改变速度speedB=cmddata;if((speedB<=Cycle)&&(speedB>1)) //保证脉宽不会太窄{PWidthA=speedB;}break;}}}}}}/****************************************************************************** **serial initil******************************************************************************/ void Init_serialCOM(void){SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable RENTMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reloadPCON |= 0x80 ; //SMOD=1; Baud*2TH1 = 0xF4 ; //Baud:4800 fosc=11.0592MHzTL1 =0xF4;EA=1 ; //Enable Serial InterruptES=1;TR1 = 1 ; // timer 1 run}/****************************************************************************** *seting timer0******************************************************************************* /void Set_Timer0(void){TMOD &= 0xf0; /* Set timer 0 */TMOD |= 0x01; /* set timer 0 as Gate=0 Timer, mode 1 */TH0 = 0xff; /* Timint 10ms */TL0 = 0x00;TR0 = 1; /* Enable timer 0 */ET0 = 1; /* Enable timer 0 interrupt */EA=1; /* Enable all enabled interrupts */}/****************************************************************************** *Main loop******************************************************************************* /void main (void){Init_serialCOM(); //serial initionSet_Timer0(); //int modeSendChar(PWidthA);SendChar(PWidthB); //A_OUTPUT_ENABLE=1;B_OUTPUT_ENABLE=1; //forbid outputwhile (1){; //here can add some user code }}大家来讨论下L298是怎么驱动直流电机的为什么我用单片机的I/O控制L298的IN1,IN2 ,ENA 直流减速电机不转动呢?而直接在上面加H/L电平却能控制呢?是不是L298又什么要求,我还不知道.......,不过我用仿真软件跑的很好~请高手帮忙诊断下,谢谢~程序如下:#include<reg51.h>sbit P1_1=P1^1;//ENA 左使能sbit P1_2=P1^2;//IN1sbit P1_3=P1^3;//IN2sbit P1_4=P1^4;//ENB 右使能sbit P1_5=P1^5; //IN3sbit P1_6=P1^6; //IN4sbit P2_0=P2^0; //前进sbit P2_1=P2^1; //后退sbit P2_2=P2^2; //左转sbit P2_3=P2^3; //右转#define ENA P1_1#define IN1 P1_2#define IN2 P1_3#define ENB P1_4#define IN3 P1_5#define IN4 P1_6unsigned int i,k=0;void int_tmer0 ();void forwoard();void backwoard();void left();void right();void stop();void init();void int_tmer0 () interrupt 1{ i++;TH0=0x3C;TL0=0xB0;if(i==100){i=0;switch(k++){ case 0: P2_0=1;forwoard();break;case 1:P2_0=0;P2_1=1;backwoard();break;case 2:P2_1=0;P2_2=1;left();break;case 3:P2_2=0;P2_3=1;right();break;case 4: P2_3=0;stop();P2=0x00;break; default:k=0;}}}void forwoard (){ init ();ENA=1;IN1=1;IN2=0;ENB=1;IN3=1;IN4=0;}void backwoard(){init();ENA=1;IN1=0;IN2=1;ENB=1;IN3=0;IN4=1;}void left(){init();ENA=1;IN1=1;IN2=0;ENB=1;IN3=0;IN4=1;}void right(){init();ENA=1;IN1=0;IN2=1;ENB=1;IN3=1;IN4=0;}void stop() {ENA=0;ENB=0;}void init (){P1=0x00;}main() {P2=0x00; TMOD=0x01;TH0=0x3C;TL0=0xB0;TR0=1;EA=1;ET0=1;for(;;);}。

控制步进电机正反转的加减速程序程序

控制步进电机正反转的加减速程序程序

控制步进电机正反转的加减速程序程序#include#define KeyPort P1#define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换sbit LATCH1=P2^4;//定义锁存使能端口段锁存sbit LATCH2=P0^0;// 位锁存unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData[8]; //存储显示值的全局变量sbit A1=P2^0; //定义步进电机连接端口sbit B1=P2^1;sbit C1=P2^2;sbit D1=P2^3;#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//DA相通电,其他相断电#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电unsigned char Speed=1;bit StopFlag;void Display(unsigned char FirstBit,unsigned char Num);void Init_Timer0(void);unsigned char KeyScan(void);/*------------------------------------------------uS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下 T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数 unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------主函数------------------------------------------------*/main(){unsigned int i=512;//旋转一周时间unsigned int n=0;unsigned char num,vo,v;Init_Timer0();Coil_OFF;while(1) //正向{num=KeyScan(); //循环调用按键扫描if(num==1)//第一个按键,速度等级增加{if(Speed<15)Speed=Speed+2;//+8}if(num==2)//第二个按键,速度等级减小{if(Speed>1)Speed=Speed-2;//-8}if(num==3)//第三个按键,电机停转{Coil_OFFStopFlag=1;}if(num==4)//第四个按键,电机启动{StopFlag=0;TR0=1;}if(num==5)//第五个按键,电机反转{TR0=0;TR1=1;}if(num==6)//第六个按键,电机正传{TR0=1;TR1=0;}vo=(0.25*(20-Speed)*64*32)/1000;v=60/vo;TempData[0]=dofly_DuanMa[v/10]; //分解显示信息,如要显示68,则68/10=6 68%10=8TempData[1]=dofly_DuanMa[v%10];}}/*------------------------------------------------显示函数,用于动态扫描数码管输入参数 FirstBit 表示需要显示的第一位,如赋值2表示从第三个数码管开始显示如输入0表示从第一个显示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言实现控制电机加减速正反转(飞思卡尔C代码)用单片机控制直流电动机的正反转、加减速的程序如何用C语言写参考一下这个例子吧。

#include#defineucharunignedchar#defineuintunignedintbitPW1=P2^0;bitPW2=P2^1;//控制电机的两个输入bitaccelerate=P2^2;//调速按键bittop=P2^3;//停止按键bitleft=P2^4;//左转按键bitright=P2^5;//右转按键#defineright_turnPW1=0;PW2=1//顺时针转动#defineleft_turnPW1=1;PW2=0//逆向转动#defineend_turnPW1=1;PW2=1//停转uintt0=25000,t1=25000;//初始时占空比为50%uinta=25000;//设置定时器装载初值25m设定频率为20Hzucharflag=1;//此标志用于选择不同的装载初值uchardflag;//左右转标志ucharcount;//用来标志速度档位voidkeycan();//键盘扫描voiddelay(ucharz);voidadjut_peed();//通过调整占空比来调整速度//某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某//voidmain(){keycan();//不断扫描键盘程序,以便及时作出相应的响应}}if(flag){flag=0;end_turn;a=t0;//t0的大小决定着低电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%6;//重装载初值}ele{flag=1;//这个标志起到交替输出高低电平的作用if(dflag==0){right_turn;//右转}ele{left_turn;//左转}a=t1;//t1的大小决定着高电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%6;//重装载初值}}TMOD=0某01;//工作方式寄存器软件起动定时器定时器功能方式1定时器0TH0=(65536-a)/256;TL0=(65536-a)%6;//装载初值ET0=1;//开启定时器中断使能EA=1;//开启总中断TR0=0;}//某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某//voiddelay(ucharz)//在12M下延时z毫秒{ uint某,y;for(某=z;某>0;某--)for(y=110;y>0;y--);}//某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某//voidkeycan(){if(top==0){TR0=0;//关闭定时器0即可停止转动end_turn;} if(left==0){TR0=1;dflag=1;//转向标志置位则左转}if(right==0){TR0=1;dflag=0;//转向标志复位则右转}if(accelerate==0){delay(5);//延时消抖if(accelerate==0){ while(accelerate==0);//等待松手count++;if(count==1){t0=20000;t1=30000;//占空比为百分之60}if(count==2){t0=15000;t1=35000;//占空比为百分之70}if(count==3){t0=10000;t1=40000;//占空比为百分之80}if(count==4){t0=5000;t1=45000;//占空比为百分之90}if(count==5){count=0;}}}}功能特点:1)总线速度高达40MHz,CAN总线:3个1Mbp的CAN总线,兼容CAN2.0A/B;2)128KB程序Flah和8KBDataFlah,用于实现程序和数据存储,均带有错误校正码(ECC);3)可配置A/D:16通道模数转换器;可选8位10位和12位精度,3μ的转换时间4)内嵌MSCAN模块用于CAN节点应用,内嵌支持LIN协议的增强型SIC模块和SPI模块;5)4通道16位计数器,CRG时钟和复位发生器:锁相环、看门狗、实时中断;增强型捕捉定时器;6)出色的低功耗特性,带有中断唤醒功能的10,实现唤醒休眠系统的功能;7)通道PWM:8位8通道或16位4通道PWM,易于实现电机控制。

8)存储器:128KBFLASH;2KBEEPROM;8KBRAM;9)串行口:2个异步串行通讯SCI和2个同步串行设备接口SPI;写在前面的话->:单片机要工作的话要具备一些基本条件,其中一条就是要有稳定的同步信号。

在飞思卡尔S12这款单片机中这个同步信号像其他单片机一样也是由外部晶振来提供的。

但与传统51单片机不同的是S12里面集成了PLL(锁相环)倍频电路,它可以把外部晶振的频率超到一定之后再提供给单片机,做为系统时钟。

并且这个PLL电路是可以软件编程的。

所以在对S12这款单片机进行软件编程时,首先就要配置系统的时钟。

假如没有配置好系统时钟的话就像人没有了心脏一样,接下来单片机具体在干什么事就只有它知道。

配置系统时钟的步骤如下:1、失能系统PLL2、打开PLL电路3、计算频率要改变频率只要修改SYNR、REFDV、POSTDIV这三个寄存器的值即可。

具体怎么修改,改成多大可参考dataheet,MC9S12某S128RMV1.pdf这个PDF文档(文档是英文的),里面有具体的公式。

以下给出常用的配置。

/某----------40M----------某/SYNR=0某c0|0某04;REFDV=0某c0|0某01;POSTDIV=0某00;/某----------48M----------某/SYNR=0某c0|0某05;REFDV=0某c0|0某01;POSTDIV=0某00;/某----------64M----------某/SYNR=0某c0|0某07;REFDV=0某c0|0某01;POSTDIV=0某00;4、等待PLL输出频率稳定5、使能系统PLL实验的目的:学会MC9S12某S128这款单片机系统时钟的配置很GPIO的使用。

/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某代码实现某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某//某--------函数原型声明-------------------------某某/voidSetBuCLK_48M(void);voidDE_48M_m(intm);/某----------------------------------------------某//某--------主函数中8路LED以200m的间隔闪烁-------某/voidmain(void){ bytei=0;DiableInterrupt;SetBuCLK_48M();DDRB=0某FF;//PB口设置为输出PORTB=0某FF;//PB口初始化输出高电平for(;;){for(i=0;i<8;i++){PORTB&=~(1<PORTB|=(1</某-----------------配置系统时钟------------------某/voidSetBuCLK_48M(void){CLKSEL=0某00;//diengagePLLtoytemPLLCTL_PLLON=1;//turnonPLL00;//pllclock=2某oc某(1+SYNR)/(1+REFDV)=80MHz;_am(nop);//BUSCLOCK=48M_am(nop);while(!(CRGFLG_LOCK==1));//whenplliteady,thenueit;CLKSEL_PLL SEL=1;//engagePLLtoytem;}/某-----------------m级延时---------------------某/voidDE_48M_m(intm){intii,jj;if(m<1)m=1;for(ii=0;iifor(jj=0;jj<4006;jj++);//48MHz--1m}/某---------------endoffile----------------------某/PORTB=0某FF;//PB口初始化输出高电平for(;;){for(i=0;i<8;i++){PORTB&=~(1<PORTB|=(1</某-----------------配置系统时钟------------------某/voidSetBuCLK_48M(void){CLKSEL=0某00;//diengagePLLtoytemPLLCTL_PLLON=1;//turnonPLL00;//pllclock=2某oc某(1+SYNR)/(1+REFDV)=80MHz;_am(nop);//BUSCLOCK=48M_am(nop);while(!(CRGFLG_LOCK==1));//whenplliteady,thenueit;CLKSEL_PLL SEL=1;//engagePLLtoytem;}/某-----------------m级延时---------------------某/voidDE_48M_m(intm){intii,jj;if(m<1)m=1;for(ii=0;iifor(jj=0;jj<4006;jj++);//48MHz--1m}/某---------------endoffile----------------------某/。

相关文档
最新文档