找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6437|回复: 8
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
STC15W4K56S4单片机PID控制直流电机转速

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


单片机源程序如下:
  1. #include "STC15W4K56S2.h"
  2. #include "Counter1.h"
  3. #include "USART.h"
  4. #include "TIMER.h"
  5. #include "PWM_CONTR.h"
  6. #define u8 unsigned char
  7. #define u16 unsigned int

  8. u16 Speed_Temp=0;
  9. sbit Led=P5^5;
  10. struct _Pid{
  11.          u8 SetSpeed;                  //设置值
  12.         u8 ActualSpeed;         //实际值
  13.         int err;
  14.         int err_next;
  15.         int err_last;
  16.         float Kp,Kd,Ki;
  17. }pid;

  18. void Seial_Creat(void);
  19. void Timer_Creat(void);
  20. void PID_Init(void);
  21. u8 PID_Motor(u8 speed, u8 Aurespeed);

  22. void main()
  23. {
  24.         Counter1_config();        
  25.         Seial_Creat();               
  26.         Timer_Creat();
  27.         pwm_Init();
  28.         PID_Init();
  29.         Led=1;
  30.         EA=1;
  31.         while(1);
  32. }
  33. void Seial_Creat(void)
  34. {
  35.           COMx_InitDefine myComx_initdefine;
  36.          myComx_initdefine.UART_Mode=UART_8bit_BRTx;        
  37.          myComx_initdefine.UART_BRT_Use=BRT_Timer2;               
  38.          myComx_initdefine.UART_BaudRate=9600;                        
  39.          myComx_initdefine.Morecommunicate=DISABLE;               
  40.          myComx_initdefine.UART_RxEnable=ENABLE;               
  41.          myComx_initdefine.BaudRateDouble=DISABLE;               
  42.          myComx_initdefine.UART_Interrupt=DISABLE;               
  43.          myComx_initdefine.UART_P_SW=UART1_SW_P30_P31;        
  44.          myComx_initdefine.UART_RXD_TXD_Short=DISABLE;
  45.          USART_Configuration(USART1, &myComx_initdefine);
  46. }
  47. void Timer_Creat(void)
  48. {
  49.         TIM_InitTypeDef myTim_inittypedef;

  50.         myTim_inittypedef.TIM_Mode=TIM_16BitAutoReload;         
  51.         myTim_inittypedef.TIM_Polity=0;                                                
  52.         myTim_inittypedef.TIM_Interrupt=ENABLE;                                
  53.         myTim_inittypedef.TIM_ClkSource=TIM_CLOCK_12T;               
  54.         myTim_inittypedef.TIM_ClkOut=DISABLE;                                 
  55.         myTim_inittypedef.TIM_Value=63900;                                       
  56.         myTim_inittypedef.TIM_Run=ENABLE;                                         //TR0=1
  57.         Timer_Inilize(Timer0,&myTim_inittypedef);
  58. }
  59. /********************* Timer0中断函数************************/
  60. void timer0_int (void) interrupt TIMER0_VECTOR
  61. {
  62.         static u8 Count1=0;
  63.         static u8 Count2=0;
  64.         u8 Speed_pwm;
  65.         if(Count1==10)
  66.         {
  67.                 TR1=0;
  68.                 Count1=0;
  69.                 Speed_Temp+=TL1;
  70.                 Count2++;
  71.                 if(Count2==4)
  72.                 {
  73.                          Speed_Temp>>=2;
  74.                         Speed_Temp=(Speed_Temp*50)/40;
  75.                         Speed_pwm=PID_Motor(20, Speed_Temp);
  76.                         pwm_Change(Speed_pwm, 0x80);
  77.                         //pwm_Change(0x80, 0x80);
  78.                         Send1_onedata(0xaa);        //发个字节标志位
  79.                         Send1_onedata((u8)Speed_Temp);
  80.                         Send1_onedata(Speed_pwm);
  81.                         Speed_Temp=0;
  82.                         Count2=0;
  83.                 }
  84.                 Led=~Led;
  85.                 TH1=0;
  86.                 TL1=0;
  87.                 TR1=1;
  88.         }
  89.         else
  90.         {
  91.                 Count1++;
  92.         }
  93. }
  94. void PID_Init(void)
  95. {
  96.          pid.SetSpeed=0;
  97.         pid.ActualSpeed=0;
  98.         pid.err=0;
  99.         pid.err_next=0;
  100.         pid.err_last=0;
  101.         pid.Kp=2;
  102.         pid.Kd=0.2;
  103.         pid.Ki=4;
  104. }
  105. u8 PID_Motor(u8 speed, u8 Aurespeed)
  106. {
  107.         int incrementspeed;
  108.         static u8 speed_value;
  109.         pid.SetSpeed=speed;
  110.         pid.err=pid.SetSpeed-Aurespeed;        
  111.         incrementspeed=pid.Kp*(pid.err-pid.err_next)+pid.Kd*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);
  112.         speed_value+=incrementspeed;
  113.         pid.err_last=pid.err_next;
  114.         pid.err_next=pid.err;
  115.         return (255-speed_value);
  116. }
复制代码






评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏8 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1 发表于 2018-6-4 03:23 | 只看该作者
好东东,如果可以的话,楼主能补全一下头文件吗?
回复

使用道具 举报

板凳
ID:122559 发表于 2018-6-16 18:38 | 只看该作者
666666666 3Q
回复

使用道具 举报

地板
ID:593833 发表于 2019-8-1 21:02 | 只看该作者
楼主,我这边有Pid 控制电机转速的问题请教,可以加下微信交流吗?
回复

使用道具 举报

5#
ID:594378 发表于 2019-8-4 23:45 | 只看该作者
有硬件接线图没?
回复

使用道具 举报

6#
ID:687671 发表于 2020-1-21 10:11 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
ID:693716 发表于 2020-2-28 11:20 来自手机 | 只看该作者
谢谢楼主分享,下载学习下,应该有帮助
回复

使用道具 举报

8#
ID:110278 发表于 2020-4-7 14:43 | 只看该作者
非常感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表