找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12235|回复: 14
收起左侧

STM32直流电机电流、速度双闭环控制系统源程序

  [复制链接]
ID:257716 发表于 2017-12-5 15:10 | 显示全部楼层 |阅读模式
我的课程设计——实现直流电机电流、速度双闭环控

stm32单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "PID_Current.h"
  3. #include "UserConfiguration.h"
  4. //定义一个位置式PID算法
  5. void PID_LocationMode1(PID_LocationMode* PID)
  6. {
  7.         if(PID->kp<0)  PID->kp = -PID->kp;
  8.         if(PID->ki<0)  PID->ki = -PID->ki;
  9.         if(PID->kd<0)  PID->kd = -PID->kd;
  10.         PID->errP   =   PID->errNow;
  11.         PID->errI   +=   PID->errNow;
  12.         if(PID->errILim!=0)
  13.         {
  14.                 if(PID->errI  >   PID->errILim) PID->errI  =  PID->errILim;
  15.                 if(PID->errI   <   -PID->errILim) PID->errI   =  -PID->errILim;
  16.                
  17.         }
  18.         PID->errD  =  PID->errNow   -  PID->errOld;
  19.         PID->errOld  =   PID->errNow;
  20.         PID->out  =   PID->kp*PID->errP +  PID->ki*PID->errI +  PID->kd*PID->kd;
  21.         
  22. }


  23. s32 adc_Tag, adcNow,adcControl;    //设定adc电压值,通过电流传感器获取到adc电压值,pwm控制
  24. PID_LocationMode PID_Current;   //定义PID算法的结构体
  25. extern u32 adcx;                 //得到adc的值
  26. void UserPIDCurrentControl(s32 adc)  
  27. {
  28.         adc_Tag=adc;          //设定adc电压值         
  29.         adcNow=adcx;  
  30.         //通过电流传感器得到adc电压值
  31.         PID_Current.errNow  = adc_Tag  -  adcNow;   //实际电压和设定电压差值
  32.         PID_Current.errILim  =   49999;                 //积分上限
  33.         PID_Current.kp  =  0;                        //写入比例系数
  34.         PID_Current.ki  =  0.15;                                                                                                                //写入积分系数
  35.         PID_Current.kd  =  0;                           //写入微分系数
  36.         
  37.         PID_LocationMode1(&PID_Current);           
  38.         adcControl =  PID_Current.out;             //得到PID的值
  39.         UserMotorSpeedSetOne(adcControl);        //放入PWM,用于收敛速度的控制中
  40. }
复制代码

主程序:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "usart.h"
  6. #include "timer.h"
  7. #include "UserConfiguration.h"
  8. #include "UserFunction.h"
  9. #include "lcd.h"
  10. #include "exti.h"
  11. #include "adc.h"
  12. #include "PID_Current.h"
  13. //PWM输出实验  

  14.         
  15. u32 spd_now=0;
  16. u32 set_spd=3300,set_vol=300,PwmOne_Set;


  17. enum {flag_add,flag_minus,flag}FLAG_SPEED;
  18. enum {flag_zheng,flag_fan,flag_stop}FLAG_DIR;

  19. extern char s;

  20.         u32 adcx;
  21.         float av;
  22. int main(void)
  23. {               
  24. //        u8 i=0,key;
  25.          
  26.         delay_init();                     //延时函数初始化         
  27.         KEY_Init();
  28.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  29.         uart_init(9600);         //串口初始化为9600
  30.          LED_Init();                             //LED端口初始化
  31.          Adc_Init();                                  //ADC初始化            
  32.          TIM1_PWM_Init(4999,71);         
  33.         
  34.         EXTIX_Init();
  35.         LCD_Init();
  36.          
  37.         POINT_COLOR=RED;
  38.         TIM3_Int_Init(9999,719);
  39.                         
  40.         FLAG_DIR=flag_zheng;   //开始是正转
  41.         FLAG_SPEED=flag;
  42.          while(1)
  43.    {   
  44.                  Motor_A=PWM_A;
  45.         
  46.         
  47.                        
  48.           //  UserPIDCurrentControl(set_vol) ;
  49.                   av=adcx*3.3/4096;
  50.                   LCD_ShowxNum(130,100,spd_now,8,16,0);    //nowspd;时时速度
  51.                   LCD_ShowxNum(130,130,set_spd,8,16,0);    //设定速度
  52.                  
  53.                   LCD_ShowxNum(130,160,3600,8,16,0);    //电机最大速度
  54.                   LCD_ShowxNum(130,190,adcx,8,16,0);           
  55.                   LCD_ShowxNum(130,230,av*1000,8,16,0);
  56.                   LCD_ShowxNum(130,250,PwmOne_Set,8,16,0);
  57.                   LCD_ShowString(50,160,100,12,16,"Max_Speed:");         
  58.                 LCD_ShowString(50,100,100,12,16,"Now_Speed:");
  59.                 LCD_ShowString(50,130,100,12,16,"Set_Speed:");        
  60.                 LCD_ShowString(50,190,100,12,16,"ADC:");        
  61.                  LCD_ShowString(50,230,100,12,16,"Voltage:");        
  62.                  adcx=Get_Adc_Average(ADC_Channel_2,10000);
  63.                  //按键设置标量速度
  64.                  
  65.                  if(FLAG_SPEED==flag_add)
  66.                         {
  67.                                 FLAG_SPEED=flag;
  68.                                 set_spd+=10;    //加速
  69.                         }
  70.                         else if(FLAG_SPEED==flag_minus)
  71.                         {
  72.                                 FLAG_SPEED=flag;
  73.                                 set_spd-=10;    //减速
  74.                         }
  75.                         if(set_spd>=3600)
  76.                         {
  77.                                 set_spd=3600;
  78.                         }
  79.                         if(set_spd<=0)
  80.                         {
  81.                                 set_spd=0;
  82.                         }
  83.                         //按键设置跟随电流的大小
  84.                         switch(KEY_Scan(1))
  85.                         {
  86.                                 case KEY0_PRES: set_vol+=10; break;
  87.                                 case KEY1_PRES: set_vol-=10; break;
  88.                                 default: break;
  89.                         }
  90.                         if(set_vol>=1000)
  91.                         {
  92.                                 set_vol=1000;
  93.                         }
  94.                         else if(set_vol<=0)
  95.                         {
  96.                                 set_vol=0;
  97.                         }
  98.                
  99.                         
  100.                         
  101.                
  102.                 // delay_ms(10);

  103.          }

  104. }

复制代码

所有资料51hei提供下载:
直流电机电流、速度双闭环控制系统.rar (362.84 KB, 下载次数: 304)

评分

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

查看全部评分

回复

使用道具 举报

ID:324643 发表于 2018-5-8 13:05 | 显示全部楼层
请问楼主有硬件资料么?
回复

使用道具 举报

ID:324643 发表于 2018-5-8 13:06 | 显示全部楼层
请问楼主有硬件资料么
回复

使用道具 举报

ID:328112 发表于 2018-5-12 10:58 | 显示全部楼层
好东西,感谢!
回复

使用道具 举报

ID:328712 发表于 2018-5-13 10:53 | 显示全部楼层
一直在找这资料,谢谢了
回复

使用道具 举报

ID:278417 发表于 2018-7-10 13:02 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:369656 发表于 2018-7-11 18:14 | 显示全部楼层
请问楼主使用什么软件写的代码
回复

使用道具 举报

ID:347110 发表于 2018-7-11 20:54 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

ID:105206 发表于 2019-1-30 18:34 | 显示全部楼层
谢谢分享,学习了
回复

使用道具 举报

ID:536282 发表于 2019-5-12 17:23 | 显示全部楼层
感谢分享!
回复

使用道具 举报

ID:69260 发表于 2019-11-13 14:28 | 显示全部楼层
不是说的电流和速度双闭环吗,咋变成了电流和位置了
回复

使用道具 举报

ID:600919 发表于 2019-11-16 09:10 | 显示全部楼层
请问楼主使用的是无刷直流电机吗
回复

使用道具 举报

ID:674455 发表于 2019-12-26 13:01 | 显示全部楼层
超有用
回复

使用道具 举报

ID:583110 发表于 2020-11-16 15:32 | 显示全部楼层
看看有没有帮助。。。。
回复

使用道具 举报

ID:228452 发表于 2022-4-5 05:16 | 显示全部楼层
This is Keil project
can you post schematic for motor board ?
Thank you
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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