我的課程設計——實現直流電機電流、速度雙閉環控
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
|