标题: 基于STC15单片机芯片的直流电机PID控制转速源码 [打印本页]

作者: LanSeXinQing    时间: 2018-6-3 20:46
标题: 基于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. }
复制代码







作者: admin    时间: 2018-6-4 03:23
好东东,如果可以的话,楼主能补全一下头文件吗?
作者: 浪里个浪121    时间: 2018-6-16 18:38
666666666 3Q
作者: Coco12138    时间: 2019-8-1 21:02
楼主,我这边有Pid 控制电机转速的问题请教,可以加下微信交流吗?
作者: Elcrace2019    时间: 2019-8-4 23:45
有硬件接线图没?
作者: huahuali    时间: 2020-1-21 10:11
谢谢分享
作者: hj08102    时间: 2020-2-28 11:20
谢谢楼主分享,下载学习下,应该有帮助
作者: linnyshow    时间: 2020-4-7 14:43
非常感谢。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1