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

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

#defineucharunignedchar#defineuintunignedint

bitPW1=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定时器0

TH0=(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;//turnonPLL

00;//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;ii

for(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;//turnonPLL

00;//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;ii

for(jj=0;jj<4006;jj++);//48MHz--1m}

/某---------------endoffile----------------------某/

电动车控制器C语言源代码讲解

#define _E_BIKE_W79E83X_C_ #include "intrins.h" #include "E_BIKE_W79E83X.H" #include"W79E834.h" /******************************************************************** ********* * 主函数 ********************************************************************* *********/ void main(void) { Init(); // 初始化 Init_IO(); // 初始化端口 H_Sample(); // 霍尔信号采样 Phase_Change(); // 相位变换 AutoHelpEN(1,0x1AA,200); /* 第一个参数设定助力功能允许与否,1为允许,0为禁止 第二个参数设定助力力量(PWM占空比),数值范围:0~0x355,数值越大,力量越大 第三个参数设定助力时间,数值越大,时间越长 */ Keep_SpeedEN(1,0x20,6); /* 第一个参数设定定速巡航功能允许与否,1为允许,0为禁止 第二个参数设定定速巡航最低速设置

第三个参数设定在巡航点保持多长时间后才进入巡航 */ Current_Lim(0xB48); /* 过流保护上限值设定 0xB00对应限电流最大大约为2.6A 0xB80对应限流值最大大约为3.8A */ LowVoltage_Lim(0x9B0); /* 欠压保护下限值设定 电池电压为47.9V时ADC采样值为0xB6 ==> 0xB60 推算电池电压为41V时的采样值为0x9B ==> 0x9B0 推算电池电压为40V时的采样值为0x98 ==> 0x980 */ EABS_Set(1,1); /* 第一个参数为滑行充电功能使能,1为允许,0为禁止第二个参数为电刹车功能使能,1为允许,0为禁止 */ Speed_LimHW(0,0,0,1); /* 硬件控制最大速度 参数只能有一个为1。 第一个参数对应15km/h 第二个参数对应20km/h

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

C语言实现控制电机加减速正反转(飞思卡尔C代码)用单片机控制直流电动机的正反转、加减速的程序如何用C语言写参考一下这个例子吧。#include #defineucharunignedchar#defineuintunignedint bitPW1=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定时器0 TH0=(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(){

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

C 语言实现单片机控制步进电机加减速源程序 1. 引言 在现代工业控制系统中,步进电机作为一种常见的执行元件,广泛应用于各种自动化设备中。而作为一种常见的嵌入式软件开发语言,C 语言在单片机控制步进电机的加减速过程中具有重要的作用。本文将从单片机控制步进电机的加减速原理入手,结合 C 语言的编程技巧,介绍如何实现单片机控制步进电机的加减速源程序。 2. 单片机控制步进电机的加减速原理 步进电机是一种能够精确控制角度的电机,它通过控制每个步骤的脉冲数来实现旋转。在单片机控制步进电机的加减速过程中,需要考虑步进电机的加速阶段、匀速阶段和减速阶段。在加速阶段,需要逐渐增加脉冲的频率,使步进电机的转速逐渐增加;在匀速阶段,需要保持恒定的脉冲频率,使步进电机以匀速旋转;在减速阶段,需要逐渐减小脉冲的频率,使步进电机的转速逐渐减小。这一过程需要通过单片机的定时器和输出控制来实现。 3. C 语言实现步进电机加减速的源程序 在 C 语言中,可以通过操作单片机的 GPIO 来控制步进电机的旋转。在编写源程序时,需要使用单片机的定时器模块来生成脉冲信号,以控制步进电机的旋转角度和速度。以下是一个简单的 C 语言源程序,用于实现步进电机的加减速控制:

```c #include void main() { // 初始化定时器 // 设置脉冲频率,控制步进电机的加减速过程 // 控制步进电机的方向 // 控制步进电机的启停 } ``` 4. 总结与回顾 通过本文的介绍,我们了解了单片机控制步进电机的加减速原理和 C 语言实现步进电机加减速源程序的基本思路。掌握这些知识之后,我们可以更灵活地应用在实际的嵌入式系统开发中。在实际项目中,我们还可以根据具体的步进电机型号和控制要求,进一步优化 C 语言源程序,实现更加精准和稳定的步进电机控制。希望本文能为读者在单片机控制步进电机方面的学习和应用提供一定的帮助。 5. 个人观点与理解 在我看来,掌握 C 语言实现单片机控制步进电机加减速源程序的技术是非常重要的。在工程领域,步进电机作为一种精准控制角度的执行

控制电机的c语言程序

#include //定义一个数组,使数码管显示的数字和数组元素的下标相等 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; sbit shuiman=P1^0;//水满 sbit sw5=P1^1;//水位5 sbit sw4=P1^2;//水位4 sbit sw3=P1^3;//水位3 sbit sw2=P1^4;//水位2 sbit sw1=P1^5;//水位1 sbit shougong=P1^6;//手工上水 sbit dianji=P1^7;//电机控制位 sbit state=P3^7;//电机工作指示 /*延时程序*/ void delay02s(void) { unsigned char i,j,k; for(i=100;i>0;i--) for(j=100;j>0;j--) for(k=248;k>0;k--); } main() { P0=0; while(1) { /*************************传感器是设计的一次只能触发一个传感器单?**************************** //水满 if(shuiman==0&&sw5==1&&sw4==1&&sw3==1&&sw2==1&&sw1==1)//当唯一的闭合一个传感器单元:水位6时发生 { dianji=1;//关电机 state=1;//电机工作指示灯熄灭 P0=table[6];//显示水位深度:6**** 已满 delay02s();//延时一段时间让数码管显示给人以提示:水已满 } //水位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)//当唯

单片机控制直流电机正反转

目录 第1章总体设计方案 (1) 1.1 总体设计方案 (1) 1.2 软硬件功能分析 (1) 第2章硬件电路设计 (2) 2.1 单片机最小系统电路设计 (2) 2.2直流电机驱动电路设计 (2) 2.3 数码管显示电路设计 (4) 2.4 独立按键电路设计 (5) 2.5 系统供电电源电路设计 (5) 2.5.1直流稳压电路中整流二极管的选取: (6) 2.5.2直流稳压电路中滤波电容的选取: (6) 第3章系统软件设计 (7) 3.1 软件总体设计思路 (7) 3.2 主程序流程设计 (7) 附录1 总体电路图 (10) 附录2 实物照片 (11) 附录3 C语言源程序 (12)

第1章总体设计方案 1.1 总体设计方案 早期直流传动的控制系统采用模拟分离器件构成,由于模拟器件有其固有的缺点,如存在温漂、零漂电压,构成系统的器件较多,使得模拟直流传动系统的控制精度及可靠性较低。随着计算机控制技术的发展,微处理器已经广泛使用于直流传动系统,实现了全数字化控制。由于微处理器以数字信号工作,控制手段灵活方便,抗干扰能力强。所以,全数字直流调速控制精度、可靠性和稳定性比模拟直流调速系统大大提高。所以,本次实习采用了驱动芯片来驱动直流电机,并运用单片机编程控制加以实现。 系统设计采用驱动芯片来控制的,所以控制精度和可靠性有了大幅度的提高,并且驱动芯片具有集成度高、功能完善的特点,从而极的大简化了硬件电路的设计。 图1.1 直流电机定时正反转方案 1.2 软硬件功能分析 本次实习直流电机控制系统以STC89C52单片机为控制核心,由按键输入模块、LED显示模块及电机驱动模块组成。采用带中断的独立式键盘作为命令的输入,单片机在程序控制下,定时不断给L293D直流电机驱动芯片发送PWM波形,H型驱动电路完成电机正,反转控制;同时单片机不停的将变化的定时时间送到LED数码管完成实时显示。

C语言机器人控制连接和控制机器人硬件

C语言机器人控制连接和控制机器人硬件由于C语言的优秀性能和广泛应用,它成为了一种广泛应用于嵌入式系统和机器人领域的编程语言。本文旨在介绍C语言在机器人控制中的连接和硬件控制方面的应用。 1. 连接机器人 1.1 串口通信 在机器人控制中,使用串口通信来连接机器人和计算机是一种常见的方式。通过串口通信,我们可以实现机器人与计算机之间的数据传输和指令控制。 C语言提供了丰富的串口编程库,比如在Windows平台下的WinAPI、在Linux平台下的termios等。使用这些库函数可以轻松地实现串口的打开、关闭、读写等操作。 1.2 无线通信 除了串口通信,无线通信也是连接机器人的一种常见方式。无线通信可以通过蓝牙、Wi-Fi、红外线等技术来实现。 在C语言中,我们可以利用相关的无线通信库函数来实现与机器人的连接和数据传输。例如,对于蓝牙通信,可以使用蓝牙串口模块,然后使用C语言编写相应的蓝牙通信程序。 2. 控制机器人硬件 2.1 舵机控制

舵机是机器人中常用的一种执行机构,用于实现机器人的运动。C 语言可以通过控制舵机的电压信号来控制舵机的角度。 具体的舵机控制方式取决于使用的硬件平台。例如,使用Arduino 等开发板,可以通过C语言编写的程序来实现舵机的控制。 2.2 传感器读取 机器人中的传感器常用于感知周围环境的信息。C语言可以用来读取传感器的数据,并根据传感器的反馈实现相应的控制策略。 以超声波传感器为例,C语言可以通过相应的读取函数获取传感器返回的距离数据,并结合算法实现避障功能。 2.3 电动机控制 电动机是机器人中常见的驱动器件,用于实现机器人的运动。C语言可以通过控制电动机的电压和电流来控制电动机的转速和方向。 类似于舵机控制,电动机控制方式也取决于使用的硬件平台。C语言可以通过编写相应的程序,实现电动机的控制。 3. 示例代码 下面是一个使用C语言控制机器人舵机的示例代码: ```c #include #include

STM32实现电机的PID控制

PID控制应该算是非常古老而且应用非常广泛的控制算法了,小到热水壶温度控制,大到控制无人机的飞行姿态和飞行速度等等。在电机控制中,PID算法用得尤为常见。 一、位置式PID 1.计算公式 在电机控制中,我们给电机输出的是一个PWM占空比的数值。 话不多说,直接上位置式PID基本公式: 控制流程图如下: 上图中的目标位置一般我们可以通过按键或者开关等方式编程实现改变目标值,测量位置就是通过stm32 去采集编码器的数据。

目标位置和测量位置之间作差就是目前系统的偏差。送入PID 控制器进行计算输出,然后再经过电机驱动的功率放大控制电机的转动去减小偏差,最终达到目标位置的过程。 2.C语言实现 如何把我们以上的理论分析和控制原理图使用C 语言写出来呢,这是一个有趣且实用的过程。位置式PID 具体通过C 语言实现的代码如下: int Position_PID (int Encoder,int Target) { static float Bias,Pwm,Integral_bias,Last_Bias; Bias=Target- Encoder; //计算偏差 Integral_bias+=Bias; //求出偏差的积分 //PID基本公式 Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias); Last_Bias=Bias; //保存上一次偏差 return Pwm; //输出 } 入口参数为编码器的位置测量值和位置控制的目标值,返回值为电机控制PWM(现在再看一下上面的控制框图是不是更加容易明白了)。 第一行是相关内部变量的定义。 第二行是求出位置偏差,由测量值减去目标值。 第三行通过累加求出偏差的积分。

三电平svpwm的c语言代码

三电平svpwm的c语言代码 三电平SVPWM(Space Vector Pulse Width Modulation)是一种常用的电力电子调制技术,广泛应用于交流电机驱动系统中。在这篇文章中,我们将介绍三电平SVPWM的原理和C语言代码实现。 让我们来了解一下SVPWM的原理。SVPWM是一种通过改变电压矢量的占空比来控制交流电机的技术。它基于矢量控制理论,将电压矢量分解为两个方向的矢量,通过改变其占空比来实现对电机的控制。SVPWM的基本原理是将三相电压分解为两个相互垂直的矢量,即一个旋转矢量和一个静止矢量。旋转矢量用来控制电机转子的速度和位置,静止矢量用来控制电机的功率输出。通过改变这两个矢量的占空比,可以实现对电机的精确控制。 接下来,让我们来看看如何用C语言实现三电平SVPWM。首先,我们需要定义一些变量来存储电压矢量和占空比信息。然后,我们可以使用循环语句来生成PWM信号。 在C语言代码中,我们可以使用if-else语句来根据电压矢量的位置来确定占空比的值。根据三电平SVPWM的原理,我们可以将电压矢量分为六个扇区,每个扇区对应于不同的占空比设置。根据电压矢量的位置,我们可以选择相应的占空比值,并将其赋值给PWM信号。 除了生成PWM信号,我们还需要考虑其他一些因素,如死区时间和

频率设置。死区时间是为了避免PWM信号的两个开关同时导通而引起的故障。频率设置决定了PWM信号的切换速度,影响了电机的响应时间和效率。 在实际应用中,我们还需要考虑一些其他因素,如过流保护、过压保护和过热保护等。这些保护机制可以有效地保护电机和电力电子器件的安全运行。 在最后,让我们来总结一下三电平SVPWM的优点和应用。三电平SVPWM具有高精度、高效率和低谐波失真的特点,适用于各种交流电机驱动系统,如电动汽车、工业自动化和再生能源等。 三电平SVPWM是一种常用的电力电子调制技术,通过改变电压矢量的占空比来实现对交流电机的精确控制。通过C语言代码的实现,我们可以有效地生成PWM信号,并应用于各种实际应用中。希望本文能够对读者理解和应用三电平SVPWM提供一些帮助。

步进电机C语言代码

#include static unsigned int count; //计数 static int step_index; //步进索引数,值为0-7 static bit turn; //步进电机转动方向 static bit stop_flag; //步进电机停止标志 static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快 static int spcount; //步进电机转速参数计数 void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒 void gorun(); //步进电机控制步进函数 void main(void) { count = 0; step_index = 0; spcount = 0; stop_flag = 0; P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; EA = 1; //允许CPU中断 TMOD = 0x11; //设定时器0和1为16位模式1

ET0 = 1; //定时器0中断允许 TH0 = 0xFE; TL0 = 0x0C; //设定时每隔0.5ms中断一次TR0 = 1; //开始计数 turn = 0; speedlevel = 2; delay(10000); speedlevel = 1; do{ speedlevel = 2; delay(10000); speedlevel = 1; delay(10000); stop_flag=1; delay(10000); stop_flag=0; }while(1); } //定时器0中断处理 void timeint(void) interrupt 1 { TH0=0xFE;

PWM调速的C语言程序编写(非常简单)

PWM调速的C语言程序编写 关于PWM的原理在上一篇文章中已经说的很详细了,现在就细说一下pwm C语言程序的编写。 C语言中PWM的编写有这么几种方法;一、用普通的I/O 口输出的PWM ,二、使用定时计数器编写,三、就是使用片内PWM了。 1 先说使用普通的I\O口编写PWM程序了。 使用I/O口输出PWM波形你必须首先明白PWM他的实质是:调制占空比,占空比就是波形中高电平的长度与整个波长的比值。我们写C语言的目的是写PWM波形的一个周期。在这个周期内高低电平的比值是可以改变的。这也就符合了PWM的原意脉宽调制。即高电平的宽度的调制。当然了PWM他也可用于改变频率,我们这里只先说他改变脉宽。 一旦我们的C语言程序写完那么他产生的PWM波形的频率就一定了。(也可写频率变化的PWM,难度有点大)一般我们控制使用1K到10K的PWM波进行控制。当然了你也可在要求不是很高的地方使用频率更低的PWM波。比如在飞思卡尔智能车比赛中我们学校使用的PWM波频率只有600HZ. 我们要改变一个PWM波周期内的高电平的宽度显然需要

将一个PWM波的周期分成单片机可以控制的N个小的周期,N的取值越大你的调速等级越高,但产生的PWM频率就越低。我们下面以实现100级调速为例编写PWM程序。 先写出程序再慢慢给大家分析 void pwm (uchar x,uint y) //X 为占空比 Y为函数使用时间 { uint i,j,a,b; for(i=y;i>0;i--) //定时外函数 { for(j=7;j>0;j--) //定时内函数 { for(a=y;a>0;a--) / /PWM波高电平宽度 { PORTA=0X01;

51单片机控制直流电机PWM调速C语言程序

#in clude #defi ne uchar un sig ned char #defi ne uint un sig ned int sbit KEY1 = P3A4; sbit KEY2 =卩3人5; sbit KEY3 =卩3人6; sbit IN1 = P1A0; sbit IN2 = P1A1; sbit ENA = P1A2; sfr ldata=0x80; sbit dula=P2A6; sbit wela=P2A7; //sbit Icde n=P3A4; //uchar timer,ms,t_set = 1; uchar T_N=100; uchar T_N1=100; uchar T_H_N=50; uchar T_H_N1=50; void msplay(uchar,uchar); uchar x1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //uchar x2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; uchar code x3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //uchar code x4[]={0x01,0x02,0x04,0x08,0x10,0x20}; void delay(ui nt z) // 延时函数 { uint x; for(x=z;x>0;x--); } void Key_Sca n() { if(KEY1 == 0) { delay(20); while(!KEY1); T_H_N++; code code

(整理)51单片机控制的步进电机C语言程序.

51单片机控制的步进电机C语言程序 用的是L298驱动的和ULN2003一样,你把它换成2003就行拉 #include unsigned char code table[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0x00,0xf1,0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0x f3,0x00}; unsigned char temp,temp_old; unsigned char key; unsigned char i,j,k,m,s; void delay(int i) { for(m=i;m>0;m--) for(j=250;j>0;j--) for(k=10;k>0;k--); } void saomiao() { P3=0xff; P3_4=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b: key=3;

break; case 0x07: key=4; break; } temp=P3; temp=temp&0x0f; while(temp!=0x0f) { temp=P3; temp=temp&0x0f; } } } P3=0xff; P3_5=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case 0x0d: key=5; break; case 0x0b: key=6; break; case 0x07: key=7; break; } temp=P3; temp=temp&0x0f;

PID控制算法的C语言实现精修订

PID控制算法的C语言 实现完整版 集团标准化工作小组#Q8QGGQT-GX8G08Q8-GNQGJ8-MHHGN#

PID控制算法的C语言实现一 PID算法原理 最近两天在考虑一般控制算法的C语言实现问题,发现网络上尚没有一套完整的比较体系的讲解。于是总结了几天,整理一套思路分享给大家。 在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制算 法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的,想想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!简单的不是原始的,简单的也不是落后的,简单到了美的程度。先看看PID算法的一般形式: PID的流程简单到了不能再简单的程度,通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和。这里我们规定(在t时刻): 1.输入量为rin(t); 2.输出量为rout(t); 3.偏差量为 err(t)=rin(t)-rout(t); pid的控制规律为 理解一下这个公式,主要从下面几个问题着手,为了便于理解,把控制环境具体一下:

1.规定这个流程是用来为直流电机调速的; 2.输入量rin(t)为电机转速预定值; 3.输出量rout(t)为电机转速实际值; 4.执行器为直流电机; 5.传感器为光电码盘,假设码盘为10线; 6.直流电机采用PWM调速转速用单位转/min表示; 不难看出以下结论: 1.输入量右口(t)为电机转速预定值(转/min); 2.输出量rout(t)为电机转速实际值(转/min); 3.偏差量为预定值和实际值之差(转/min); 那么以下几个问题需要弄清楚: 1.通过PID环节之后的U(t)是什么值呢 2.控制执行器(直流电机)转动转速应该为电压值(也就是PWM占空比)。 3.那么U(t)与PWM之间存在怎样的联系呢 (见附录1)这篇文章上给出了一种方法,即,每个电压对应一个转速,电压和转速之间呈现线性关系。但是我考虑这种方法的前提是把直流电机的特性理解为线性了,而实际情况下,直流电机的特性绝对不是线性的,或者说在局部上是趋于线性的,这就是为什么说PID调速有个范围的问题。具体看一下(见附录2)这篇文章就可以了解了。所以在正式进行调速设计之前,需要现有开环系统,测试电机和转速之间的特性曲线(或者查阅电机的资料说明),然后再进行闭环参数整定。这篇先写到这,下一篇说明连续系统的离散化问题。并根据离散化后的特点讲述位置型PID和增量型PID的用法和C语言实现过程。

基于C语言的步进电机调速

基于C语言的步进电机调速

课程设计 (论文) 题目基于C语言的步进电机调速

目录 0. 前言 (4) 1.步进电机的基本理论 (5) 2. 方案设计 (5) 2.1 步进电机 (6) 2.2 8255芯片 (6) 3. 硬件电路的工作原理 (6) 3.1 步进电机硬件电路图 (7) 3.2 驱动选择 (9) 4. 软件编程 (9) 5. 系统调试和结果分析 (10) 6. 结论及进一步设想 (16) 参考文献 (17) 附录1 元件清单 (18) 课设体会 (19)

基于C语言的步进电机调速 摘要:步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用步进电机来控制变的非常的简单。步进电机的调速一般是改变输入步进电机的脉冲的频率来实现步进电机的调速,因为步进电机每给一个脉冲就转动一个固定的角度,这样就可以通过控制步进电机的一个脉冲到下一个脉冲的时间间隔来改变脉冲的频率,延时的长短来具体控制步进角来改变电机的转速,从而实现步进电机的调速。在本方案中,利用计算机控制教学实验模型系统,通过计算机对8255PB口输出电平信号的控制,实现步进电机速度、方向、及旋转角度的计算机控制。 关键词:步进电机;方向控制;转速控制 0. 前言 步进电机最早是在1920年由英国人所开发。1950年后期晶体管的发明也逐渐应用在步进电机上,这对于数字化的控制变得更为容易。以后经过不断改良,使得今日步进电机已广泛运用在需要高定位精度、高分解性能、高响应性、信赖性等灵活控制性高的机械系统中。在生产过程中要求自动化、省人力、效率高的机器中,我们很容易发现步进电机的踪迹,尤其以重视速度、位置控制、需要精确操作各项指令动作的灵活控制性场合步进电机用得最多。步进电机作为执行元件,是机电一体化的关键产品之一, 广泛应用在各种自动化控制系统中。随着微电子和计算机技术的发展,步进电机的需求量与日俱增,在各个国民经济领域都有应用。 步进电机是将电脉冲信号变换成角位移或直线位移的执行部件。步进电机可以直接用数字信号驱动,使用非常方便。一般电动机都是连续转动的,而步进电动机则有定位和运转两种基本状态,当有脉冲输入时步进电动机一步一步地转动,每给它一个脉冲信号,它就转过一定的角度。步进电动机的角位移量和输入脉冲的个数严格成正比,在时间上与输入脉冲同步,因此只要控制输入脉冲的数量、频率及电动机绕组通电的相序,便可获得所需的转角、转速及转动方向。在没有脉冲输入时,在绕组电源的激励下气隙磁场能使转子保持原有位置处于定位状态。因此非常适合于单片机控制。步进电机还具有快速启动、精确步进和定位等特点,因而在数控机床,绘图仪,打印机以及光学仪器中得到广泛的应用。步进电动机已成为除直流电动机和交流电动机以外的第三类电动机。传统电动机作为机电能量转换装置,在人类的生产和生活进入电气化过程中起着关键的作用。步进电机可以作

直流电机控制原理及C程序

项目八键盘控制电机方向和转速 教学目标 终极目标 能利用AT89S52单片机及独立键盘,通过C语言程序实现键盘控制步进电机和直流电机的速度和方向,完成单片机输入输出控制系统的设计、运行及调试; 促成目标 1. 了解单片机产品开发的流程; 2. 了解步进电机和直流电机结构和工作原理; 3. 掌握步进电机和直流电机速度、方向控制关键技术; 4. 掌握头文件的编写方法; 5. 掌握电机速度、方向控制的电路设计和编程的方法; 6. 会利用单片机I/O口实现电机速度、方向控制; 单片机产品开发 单片机产品开发是为完成某项任务而研制开发的单片机应用系统,是以单片机为核心,配以外围电路和软件,能实现确定任务、功能的实际应用系统;根据不同的用途和要求,单片机产品的系统配置及软件也有所不同,但它们的开发流程和方法大致相同;

8.1.1 单片机产品的结构 单片机产品是由硬件和软件组成;硬件是指单片机、扩展的存储器、输入输出设备等硬件部件组成的,软件是各种工作程序的总称;一个典型单片机产品结构如图8-1所示; 图8-1典型单片机产品结构 从图8-1不难看出单片机产品所需要的一般配置: 1单片机;如AT89C51、AT89C52、AT89S51以及AT89S52等单片机; 2人机交流设备;输入设备有键盘和按键,输出设备有数码管、液晶显示模块和指示灯等; 3信号采集的输入通道;如出租车的测距、测速装置,温控系统的温度传感器、洗衣机的水位测量等设备; 4向操作对象发出各种控制信号的输出通道;如空调启动压缩机的开关电路,控制彩电的频道切换、颜色、音量等的接口电路; 5与其他计算机系统或智能设备实现信息交换,还需配置通信接口电路;如RS-232、RS-485等; 6有时还需扩展外部RAM、EEPROM用于存放数据;如彩电遥控系统中存放系统数据的存储器; 8.1.2 单片机产品开发流程 1.确定功能技术指标 单片机产品开发流程是以确定产品的功能和技术指标开始的; 首先要细致分析、研究实际问题,明确各项任务与要求,综合考虑系统的

(完整word版)直流电动机正反转proteus仿真设计概要

直流电动机正反转Proteus仿真设计 引言 随着人民生活水平的提高,产品质量、性能、自动化程度等已经是人们选择产品的主要因素.其中,直流电动机正反转自动控制在生活中起了很大的作用,比如洗衣机的工作、遥控汽车的操作、DVD的应用等等,它在实际生活中给人们需求上提供了很大的方便与乐趣。不只是生活,它还在工业、农业、交通运输等各方面得到了广泛的应用,实现电动机正反转的控制是很多产品设计的核心问题。直流电动机显示出交流电动机不能比拟的良好启动性能和调速性能,比较广泛应用于速度调节要求过高,正反转频繁或多元同步协调运转的机械生产。因此,学会电动机正反转控制的原理是极其重要的。然而,在本直流电动机正反转仿真设计中,要借助Proteus 软件、Keil软件和C语言的辅助进行仿真设计,通过仿真设计,让我们更清楚了解电动机正反转的原理和电路图,增强对直流电动机的认知。 在Proteus绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在Proteus的原理图中看到模拟的实物运行状态和过程,Proteus还提供了一个图形显示功能,可以将线路上变化的信号,以图形的方式实时地显示出来,其作用与示波器相似,但功能更多.这些虚拟仪器仪表具有理想的参数指标,例如极高的输入阻抗、极低的输出阻抗。这些都尽可能减少了仪器对测量结果的影响。在本设计中,Proteus软件采用了电容、电阻、晶振、电动机、LED、开关、电动机等多种元件进行绘图,并基于80C51和ULN2003A进行电路图设计,充分展示Proteus 软件元件库量大,掌握它的基本绘图操作。而对于Keil软件,采取创建工程,创建执行文件,利用C语言编写程序,生成hex文件,为Proteus仿真提供驱动控制,实现直流电动机正反转的设计。 在本论文设计中,主要介绍直流电动机正反转原理,Proteus软件功能绘图、仿真调试,以及Keil软件功能、程序编写和仿真程序文件生成。让大家更清楚了解Proteus软件、Keil软件、

PID控制算法的C语言实现(完整版)

PID控制算法的C语言实现一 PID算法原理之欧侯瑞魂创作 最近两天在考虑一般控制算法的C语言实现问题,发现网络上尚没有一套完整的比较体系的讲解。于是总结了几天,整理一套思路分享给大家。 在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西经常是简单的,而且是最简单的,想想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!简单的不是原始的,简单的也不是落后的,简单到了美的程度。先看看PID算法的一般形式: PID的流程简单到了不克不及再简单的程度,通过误差信号控制被控量,而控制器自己就是比例、积分、微分三个环节的加和。这里我们规定(在t时刻): 1.输入量为rin(t); 2.输出量为rout(t);

3.偏差量为err(t)=rin(t)rout(t); pid的控制规律为 理解一下这个公式,主要从下面几个问题着手,为了便于理解,把控制环境具体一下: 1.规定这个流程是用来为直流电机调速的; 2.输入量rin(t)为电机转速预定值; 3.输出量rout(t)为电机转速实际值; 4.执行器为直流电机; 5.传感器为光电码盘,假设码盘为10线; 6.直流电机采取PWM调速转速用单位转/min 暗示; 不难看出以下结论: 1.输入量rin(t)为电机转速预定值(转/min); 2. 输出量rout(t)为电机转速实际值(转/min); 3.偏差量为预定值和实际值之差(转/min); 那么以下几个问题需要弄清楚: 1.通过PID环节之后的U(t)是什么值呢?

PID控制算法的C语言实现(完整版)

PID控制算法的C语言实现一 PID算法原理 最近两天在考虑一般控制算法的C语言实现问题,发现网络上尚没有一套完整的比较体系的讲解。于是总结了几天,整理一套思路分享给大家。 在工业应用中PID及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握PID算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵的是,在我所接触的控制算法当中,PID控制算法又是最简单,最能体现反馈思想的控制算法,可谓经典中的经典。经典的未必是复杂的,经典的东西常常是简单的,而且是最简单的,想想牛顿的力学三大定律吧,想想爱因斯坦的质能方程吧,何等的简单!简单的不是原始的,简单的也不是落后的,简单到了美的程度。先看看PID算法的一般形式: PID的流程简单到了不能再简单的程度,通过误差信号控制被控量,而控制器本身就是比例、积分、微分三个环节的加和。这里我们规定(在t时刻): 1.输入量为rin(t); 2.输出量为rout(t); 3.偏差量为err(t)=rin(t)-rout(t); pid的控制规律为 理解一下这个公式,主要从下面几个问题着手,为了便于理解,把控制环境具体一下: 1.规定这个流程是用来为直流电机调速的;

2.输入量rin(t)为电机转速预定值; 3.输出量rout(t)为电机转速实际值; 4.执行器为直流电机; 5.传感器为光电码盘,假设码盘为10线; 6.直流电机采用PWM调速转速用单位转/min表示; 不难看出以下结论: 1.输入量rin(t)为电机转速预定值(转/min); 2. 输出量rout(t)为电机转速实际值(转/min); 3.偏差量为预定值和实际值之差(转/min); 那么以下几个问题需要弄清楚: 1.通过PID环节之后的U(t)是什么值呢? 2.控制执行器(直流电机)转动转速应该为电压值(也就是PWM占空比)。 3.那么U(t)与PWM之间存在怎样的联系呢? https://www.360docs.net/doc/4d19202238.html,/user1/3407/archives/2006/33541.html(见附录1)这篇文章上给出了一种方法,即,每个电压对应一个转速,电压和转速之间呈现线性关系。但是我考虑这种方法的前提是把直流电机的特性理解为线性了,而实际情况下,直流电机的特性绝对不是线性的,或者说在局部上是趋于线性的,这就是为什么说PID调速有个范围的问题。具体看一下 https://www.360docs.net/doc/4d19202238.html,/component/article90249.htm(见附录2)这篇文章就可以了解了。所以在正式进行调速设计之前,需要现有开环系统,测试电机和转速之间的特性曲线(或者查阅电机的资料说明),然后再进行闭环参数整定。这篇先写到这,下一篇说明连续系统的离散化问题。并根据离散化后的特点讲述位置型PID和增量型PID的用法和C语言实现过程。

相关文档
最新文档