我的课程设计——实现直流电机电流、速度双闭环控
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)
|