基于STC15单片机芯片的直流电机PID控制转速源码

2020-01-21来源: 51hei关键字:STC15单片机  直流电机  PID  控制转速

STC15W4K56S4单片机PID控制直流电机转速

下面是制作出来的实物图:

电机上电运行平稳

电机上电运行平稳

L298N控制电机转速

L298N控制电机转速

STC控制板

STC控制板 

单片机源程序如下:

#include "STC15W4K56S2.h"

#include "Counter1.h"

#include "USART.h"

#include "TIMER.h"

#include "PWM_CONTR.h"

#define u8 unsigned char

#define u16 unsigned int


u16 Speed_Temp=0;

sbit Led=P5^5;

struct _Pid{

         u8 SetSpeed;                  //设置值

        u8 ActualSpeed;         //实际值

        int err;

        int err_next;

        int err_last;

        float Kp,Kd,Ki;

}pid;


void Seial_Creat(void);

void Timer_Creat(void);

void PID_Init(void);

u8 PID_Motor(u8 speed, u8 Aurespeed);


void main()

{

        Counter1_config();        

        Seial_Creat();                

        Timer_Creat();

        pwm_Init();

        PID_Init();

        Led=1;

        EA=1;

        while(1);

}

void Seial_Creat(void)

{

          COMx_InitDefine myComx_initdefine;

         myComx_initdefine.UART_Mode=UART_8bit_BRTx;        

         myComx_initdefine.UART_BRT_Use=BRT_Timer2;                

         myComx_initdefine.UART_BaudRate=9600;                        

         myComx_initdefine.Morecommunicate=DISABLE;                

         myComx_initdefine.UART_RxEnable=ENABLE;                

         myComx_initdefine.BaudRateDouble=DISABLE;                

         myComx_initdefine.UART_Interrupt=DISABLE;                

         myComx_initdefine.UART_P_SW=UART1_SW_P30_P31;        

         myComx_initdefine.UART_RXD_TXD_Short=DISABLE;

         USART_Configuration(USART1, &myComx_initdefine);

}

void Timer_Creat(void)

{

        TIM_InitTypeDef myTim_inittypedef;


        myTim_inittypedef.TIM_Mode=TIM_16BitAutoReload;         

        myTim_inittypedef.TIM_Polity=0;                                                

        myTim_inittypedef.TIM_Interrupt=ENABLE;                                

        myTim_inittypedef.TIM_ClkSource=TIM_CLOCK_12T;                

        myTim_inittypedef.TIM_ClkOut=DISABLE;                                 

        myTim_inittypedef.TIM_Value=63900;                                        

        myTim_inittypedef.TIM_Run=ENABLE;                                         //TR0=1

        Timer_Inilize(Timer0,&myTim_inittypedef);

}

/********************* Timer0中断函数************************/

void timer0_int (void) interrupt TIMER0_VECTOR

{

        static u8 Count1=0;

        static u8 Count2=0;

        u8 Speed_pwm;

        if(Count1==10)

        {

                TR1=0;

                Count1=0;

                Speed_Temp+=TL1;

                Count2++;

                if(Count2==4)

                {

                         Speed_Temp>>=2;

                        Speed_Temp=(Speed_Temp*50)/40;

                        Speed_pwm=PID_Motor(20, Speed_Temp);

                        pwm_Change(Speed_pwm, 0x80);

                        //pwm_Change(0x80, 0x80);

                        Send1_onedata(0xaa);        //发个字节标志位

                        Send1_onedata((u8)Speed_Temp);

                        Send1_onedata(Speed_pwm); 

                        Speed_Temp=0;

                        Count2=0;

                }

                Led=~Led;

                TH1=0;

                TL1=0;

                TR1=1;

        }

        else

        {

                Count1++;

        }

}

void PID_Init(void)

{

         pid.SetSpeed=0;

        pid.ActualSpeed=0;

        pid.err=0;

        pid.err_next=0;

        pid.err_last=0;

        pid.Kp=2;

        pid.Kd=0.2;

        pid.Ki=4;

}

u8 PID_Motor(u8 speed, u8 Aurespeed)

{

        int incrementspeed;

        static u8 speed_value;

        pid.SetSpeed=speed;

        pid.err=pid.SetSpeed-Aurespeed;        

        incrementspeed=pid.Kp*(pid.err-pid.err_next)+pid.Kd*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);

        speed_value+=incrementspeed;

        pid.err_last=pid.err_next;

        pid.err_next=pid.err;

        return (255-speed_value);

}

关键字:STC15单片机  直流电机  PID  控制转速 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic486351.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:51单片机IO口模拟UART串口通信
下一篇:51单片机理通定时器输出PWM例程

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC15系列单片机ADC函数库的20200208优化版
;        //默认电源电压5V,检测电压乘100倍,保留2个小数点数字        //ADC各端口转换结果存储到单片机总存储空间        Dpj_ZongCunChu[Dpj_AdcCunChuAddr+i*2]=t;        Dpj_ZongCunChu[Dpj_AdcCunChuAddr+i*2+1]=t>>8;}/***************************************ADC转换函数说明:当前ADC端口转换完成时,循环
发表于 2020-02-11
用STc15f104e单片机做了个学习型红外遥控开关程序
用STc15f104e做了个学习型红外遥控开关、是上电学习的不带按键的,=上电学习指示灯闪烁,按遥控器,指示灯灭了下, 学习开机键成功。指示灯继续闪,再按遥控器,指示灯灭了,学习关机键成功,进入待机状态。上电2秒不学习退出,进入待机状态。电路原理图如下: 这个是上电学习型红外遥控开关,须要学习开,和关,须要学习两只按键,单片机源程序如下:#include "STC15F104E.H"#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned
发表于 2020-01-31
用STc15f104e单片机做了个学习型红外遥控开关程序
分享一下stc15单片机的PWM波程序
#include  "include.h"/*------------------pwm功能初始化-------------------*/void PWM_GO(void){        PWMCFG &= 0xBF;                         //将CBTADC位置0,即PWM计数器归零时不触发ADC转换        PWMIF &= 0xBF;&nb
发表于 2020-01-28
STC89C52RC单片机+串口+红外控制16路舵机程序
只有控制16路舵机的程序,现在发上来提供参考舵机可以通过串口控制,也可以用红外控制单片机源程序如下:#include "PCA9685_TJ.h"#include <stdio.h>#include <math.h>/*使用说明:        在main主程序                PCA9685_init();        在main主程序的while加入       
发表于 2020-01-20
STC89C52RC单片机+串口+红外控制16路舵机程序
单片机成长之路(51基础篇) - 004 STC89C52MCU 软件系统复位
用户应用程序在运行过程中,有时会有特殊需求,需要实现单片机系统复位(热启动之一),传统的8051单片机由于硬件上未支持此功能,用户必须用软件模拟实现,实现起来较麻烦。STC单片机增加了相应的硬件功能,内部的ISP/IAP控制寄存器ISP_CONTR便可以实现此功能。用户只需简单的控制ISP_CONTR特殊功能寄存器的其中两位SWBS和SWRST就可以实现系统复位。 ISP/IAP控制寄存器(ISP_CONTR)STC单片机ISP/IAP控制寄存器在特殊功能寄存器中的字节地址为E7H,不能位寻址,该寄存器用来管理和ISP/IAP相关的功能设定及是否软件复位等。单片机复位时该寄存器全部被清0。其各位的定义如表4.3.1所示
发表于 2020-01-16
单片机成长之路(51基础篇) - 004 STC89C52MCU 软件系统复位
基于51单片机的pwm直流电机调速
;         Dynamic_Display();                //动态显示                        if(true == MotoStart)        //如果电机启动                   
发表于 2020-02-08
基于51单片机的pwm直流电机调速
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved