|
用的是timer1高級定時器控制無刷直流電機
此程序只有轉(zhuǎn)速PID 速度通過程序Set_Point調(diào)節(jié) 調(diào)節(jié)范圍在100到12000之間
KEY2控制無刷電機啟動
KEY3控制無刷電機停止
電路原理圖如下:
單片機源程序如下:
pid.c
- /*====================================================================================================
- 增量式PID
- The PID (比例、積分、微分) function is used in mainly
- control applications. PIDCalc performs one iteration of the PID
- algorithm.
- While the PID function works, main is just a dummy program showing
- a typical usage.
- =====================================================================================================*/
- #define Set_Point 1000 //100 10000
- #define PWM_Max 1400
- #define PWM_Min 50
- typedef struct PID
- {
- int Target; //設(shè)定目標(biāo) Desired Value
- int Uk; //Uk
- int Udk; //Udk增量
- int Uk_1; //Uk-1
- double P; //比例常數(shù) Proportional Const
- double I; //積分常數(shù) Integral Const
- int b;
- double D; //微分常數(shù) Derivative Const
- int ek_0; //ek
- int ek_1; //ek-1
- int ek_2; //ek-2
- }PID;
- static PID Speed_PID;
- static PID *Speed_Point = &Speed_PID;
- /*====================================================================================================
- Initialize PID Structure PID參數(shù)初始化
- =====================================================================================================*/
- void Speed_PIDInit(void)
- {
- Speed_Point->Target = Set_Point;
- Speed_Point->Uk = 0;
- Speed_Point->Udk = 0;
- Speed_Point->Uk_1 = PWM_Min;
- Speed_Point->ek_0 = 0; //ek=0
- Speed_Point->ek_1 = 0; //ek-1=0
- Speed_Point->ek_2 = 0; //ek-2=0
- Speed_Point->P = 4; //比例常數(shù) Proportional Const
- Speed_Point->I = 0.084; //積分常數(shù)Integral Const
- Speed_Point->b = 1;
- Speed_Point->D = 1.8; //微分常數(shù) Derivative Const
- }
- /*====================================================================================================
- 增量式PID計算部分
- =====================================================================================================*/
- int Speed_PIDAdjust(int Next_Point)
- {
- Speed_Point->ek_0= Speed_Point->Target - Next_Point; //增量計算
- /*遇限削弱積分即控制量Uk進入飽和區(qū),便停止進行增大的積分項運算,而只進行使積分減少的運算*/
- if(((Speed_Point->Uk_1>=PWM_Max)&&(Speed_Point->ek_0>=0))||((Speed_Point->Uk_1<=PWM_Min)&&(Speed_Point->ek_0<=0)))
- {
- Speed_Point->b=0;
- }
- else
- {
- Speed_Point->b=1;
- }
- Speed_Point->Udk=Speed_Point->P*(Speed_Point->ek_0-Speed_Point->ek_1) + Speed_Point->b*Speed_Point->I*Speed_Point->ek_0
- + Speed_Point->D*(Speed_Point->ek_0-2*Speed_Point->ek_1+Speed_Point->ek_2);
- /* 存儲誤差,用于下次計算 */
- Speed_Point->Uk = Speed_Point->Uk_1 + Speed_Point->Udk;
- Speed_Point->ek_2 = Speed_Point->ek_1;
- Speed_Point->ek_1 = Speed_Point->ek_0;
- Speed_Point->Uk_1 = Speed_Point->Uk;
- if(Speed_Point->Uk >= PWM_Max)
- {
- return PWM_Max;
- }
- else if(Speed_Point->Uk <= PWM_Min)
- {
- return PWM_Min;
- }
- return(Speed_Point->Uk);
- }
復(fù)制代碼
- #include "includes.h"
- /********************CoOS變量**********************/
- #define TASK_STK_SIZE 128
- #define TASK0_PRIO 2
- #define TASK1_PRIO 3
- OS_STK STK_TASK0[TASK_STK_SIZE];
- OS_STK STK_TASK1[TASK_STK_SIZE];
- void TASK0(void *param);
- void TASK1(void *param);
- /*************************************************/
- /*********************一般變量********************/
- extern uint32_t Speed_count;
- uint8_t USART_Flag = 0;
- /*************************************************/
- int main(void)
- {
- /* 片內(nèi)外設(shè)初始化 */
- Periph_Init();
-
- /* 操作系統(tǒng)初始化 */
- CoInitOS();
- CoCreateTask( TASK0, (void*)0, TASK0_PRIO, &STK_TASK0[TASK_STK_SIZE - 1], TASK_STK_SIZE);
- CoCreateTask( TASK1, (void*)0, TASK1_PRIO, &STK_TASK1[TASK_STK_SIZE - 1], TASK_STK_SIZE);
- CoStartOS();
- while(1);
- }
- void TASK0(void *param)
- {
- uint16_t data;
- KEY_Init();
- Speed_PIDInit();
- for(;;)
- {
- if(KEY_Read(KEY1))
- {
- CoTickDelay(5);
- if(KEY_Read(KEY1))
- {
- BLDC_Start();
- }
- }
- if(KEY_Read(KEY2))
- {
- CoTickDelay(5);
- if(KEY_Read(KEY2))
- {
- BLDC_Stop();
- }
- }
- if(USART_Flag)
- {
- data = 1000000/(6*Speed_count);
- USART_SendData( USART2, data);
- USART_Flag = 0;
- }
- CoTickDelay(5);
- }
- }
- void TASK1(void *param)
- {
- for(;;)
- {
- LED_On();
- CoTickDelay(200);
- LED_Off();
- CoTickDelay(200);
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
速度環(huán)PID.rar
(390.88 KB, 下載次數(shù): 575)
2018-3-14 02:49 上傳
點擊文件名下載附件
|
|