用的是timer1高级定时器控制无刷直流电机
此程序只有转速PID 速度通过程序Set_Point调节 调节范围在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; //设定目标 Desired Value
- int Uk; //Uk
- int Udk; //Udk增量
- int Uk_1; //Uk-1
- double P; //比例常数 Proportional Const
- double I; //积分常数 Integral Const
- int b;
- double D; //微分常数 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参数初始化
- =====================================================================================================*/
- 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; //比例常数 Proportional Const
- Speed_Point->I = 0.084; //积分常数Integral Const
- Speed_Point->b = 1;
- Speed_Point->D = 1.8; //微分常数 Derivative Const
- }
- /*====================================================================================================
- 增量式PID计算部分
- =====================================================================================================*/
- int Speed_PIDAdjust(int Next_Point)
- {
- Speed_Point->ek_0= Speed_Point->Target - Next_Point; //增量计算
- /*遇限削弱积分即控制量Uk进入饱和区,便停止进行增大的积分项运算,而只进行使积分减少的运算*/
- 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);
- }
复制代码
- #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)
- {
- /* 片内外设初始化 */
- Periph_Init();
-
- /* 操作系统初始化 */
- 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);
- }
- }
复制代码
所有资料51hei提供下载:
速度环PID.rar
(390.88 KB, 下载次数: 575)
|