标题:
STM32直流电机电流、速度双闭环控制系统源程序
[打印本页]
作者:
hongmiao4552
时间:
2017-12-5 15:10
标题:
STM32直流电机电流、速度双闭环控制系统源程序
我的课程设计——实现直流电机电流、速度双闭环控
stm32单片机源程序如下:
#include "stm32f10x.h"
#include "PID_Current.h"
#include "UserConfiguration.h"
//定义一个位置式PID算法
void PID_LocationMode1(PID_LocationMode* PID)
{
if(PID->kp<0) PID->kp = -PID->kp;
if(PID->ki<0) PID->ki = -PID->ki;
if(PID->kd<0) PID->kd = -PID->kd;
PID->errP = PID->errNow;
PID->errI += PID->errNow;
if(PID->errILim!=0)
{
if(PID->errI > PID->errILim) PID->errI = PID->errILim;
if(PID->errI < -PID->errILim) PID->errI = -PID->errILim;
}
PID->errD = PID->errNow - PID->errOld;
PID->errOld = PID->errNow;
PID->out = PID->kp*PID->errP + PID->ki*PID->errI + PID->kd*PID->kd;
}
s32 adc_Tag, adcNow,adcControl; //设定adc电压值,通过电流传感器获取到adc电压值,pwm控制
PID_LocationMode PID_Current; //定义PID算法的结构体
extern u32 adcx; //得到adc的值
void UserPIDCurrentControl(s32 adc)
{
adc_Tag=adc; //设定adc电压值
adcNow=adcx;
//通过电流传感器得到adc电压值
PID_Current.errNow = adc_Tag - adcNow; //实际电压和设定电压差值
PID_Current.errILim = 49999; //积分上限
PID_Current.kp = 0; //写入比例系数
PID_Current.ki = 0.15; //写入积分系数
PID_Current.kd = 0; //写入微分系数
PID_LocationMode1(&PID_Current);
adcControl = PID_Current.out; //得到PID的值
UserMotorSpeedSetOne(adcControl); //放入PWM,用于收敛速度的控制中
}
复制代码
主程序:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "UserConfiguration.h"
#include "UserFunction.h"
#include "lcd.h"
#include "exti.h"
#include "adc.h"
#include "PID_Current.h"
//PWM输出实验
u32 spd_now=0;
u32 set_spd=3300,set_vol=300,PwmOne_Set;
enum {flag_add,flag_minus,flag}FLAG_SPEED;
enum {flag_zheng,flag_fan,flag_stop}FLAG_DIR;
extern char s;
u32 adcx;
float av;
int main(void)
{
// u8 i=0,key;
delay_init(); //延时函数初始化
KEY_Init();
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
LED_Init(); //LED端口初始化
Adc_Init(); //ADC初始化
TIM1_PWM_Init(4999,71);
EXTIX_Init();
LCD_Init();
POINT_COLOR=RED;
TIM3_Int_Init(9999,719);
FLAG_DIR=flag_zheng; //开始是正转
FLAG_SPEED=flag;
while(1)
{
Motor_A=PWM_A;
// UserPIDCurrentControl(set_vol) ;
av=adcx*3.3/4096;
LCD_ShowxNum(130,100,spd_now,8,16,0); //nowspd;时时速度
LCD_ShowxNum(130,130,set_spd,8,16,0); //设定速度
LCD_ShowxNum(130,160,3600,8,16,0); //电机最大速度
LCD_ShowxNum(130,190,adcx,8,16,0);
LCD_ShowxNum(130,230,av*1000,8,16,0);
LCD_ShowxNum(130,250,PwmOne_Set,8,16,0);
LCD_ShowString(50,160,100,12,16,"Max_Speed:");
LCD_ShowString(50,100,100,12,16,"Now_Speed:");
LCD_ShowString(50,130,100,12,16,"Set_Speed:");
LCD_ShowString(50,190,100,12,16,"ADC:");
LCD_ShowString(50,230,100,12,16,"Voltage:");
adcx=Get_Adc_Average(ADC_Channel_2,10000);
//按键设置标量速度
if(FLAG_SPEED==flag_add)
{
FLAG_SPEED=flag;
set_spd+=10; //加速
}
else if(FLAG_SPEED==flag_minus)
{
FLAG_SPEED=flag;
set_spd-=10; //减速
}
if(set_spd>=3600)
{
set_spd=3600;
}
if(set_spd<=0)
{
set_spd=0;
}
//按键设置跟随电流的大小
switch(KEY_Scan(1))
{
case KEY0_PRES: set_vol+=10; break;
case KEY1_PRES: set_vol-=10; break;
default: break;
}
if(set_vol>=1000)
{
set_vol=1000;
}
else if(set_vol<=0)
{
set_vol=0;
}
// delay_ms(10);
}
}
复制代码
所有资料51hei提供下载:
直流电机电流、速度双闭环控制系统.rar
(362.84 KB, 下载次数: 304)
2017-12-5 20:17 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
电气技术小白
时间:
2018-5-8 13:05
请问楼主有硬件资料么?
作者:
电气技术小白
时间:
2018-5-8 13:06
请问楼主有硬件资料么
作者:
tfl0328
时间:
2018-5-12 10:58
好东西,感谢!
作者:
bg4abz
时间:
2018-5-13 10:53
一直在找这资料,谢谢了
作者:
三电子
时间:
2018-7-10 13:02
谢谢楼主分享
作者:
Hu187
时间:
2018-7-11 18:14
请问楼主使用什么软件写的代码
作者:
wanever
时间:
2018-7-11 20:54
感谢楼主分享
作者:
jubaolun
时间:
2019-1-30 18:34
谢谢分享,学习了
作者:
Brevent
时间:
2019-5-12 17:23
感谢分享!
作者:
wishhe320
时间:
2019-11-13 14:28
不是说的电流和速度双闭环吗,咋变成了电流和位置了
作者:
51lt
时间:
2019-11-16 09:10
请问楼主使用的是无刷直流电机吗
作者:
尹家琪
时间:
2019-12-26 13:01
超有用
作者:
yoqsh
时间:
2020-11-16 15:32
看看有没有帮助。。。。
作者:
mick32
时间:
2022-4-5 05:16
This is Keil project
can you post schematic for motor board ?
Thank you
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1