PID 源碼,大家可以看看,討論討論。
單片機源程序如下:
- #include "sys.h"
- u8 Flag_Stop=1; //停止標志位
- int Encoder; //編碼器的脈沖計數
- int Moto1; //電機PWM變量 應是Motor的 向Moto致敬
- int main(void)
- {
- Stm32_Clock_Init(9); //系統時鐘設置
- delay_init(72); //延時初始化
- LED_Init(); //初始化與 LED 連接的硬件接口
- uart_init(72,115200); //初始化串口1
- MiniBalance_PWM_Init(7199,0); //=====初始化PWM 10KHZ 高頻可以防止電機低頻時的尖叫聲
- Encoder_Init_TIM2(); //初始化編碼器
- Timer3_Init(99,7199); //=====10MS進一次中斷服務函數,中斷服務函數在control.c
- while(1)
- {
- printf("%d\r\n",Encoder);
- }
- }
復制代碼- #include "motor.h"
- void MiniBalance_Motor_Init(void)
- {
- RCC->APB2ENR|=1<<3; //PORTB時鐘使能
- GPIOB->CRH&=0X0000FFFF; //PORTB12 13 14 15推挽輸出
- GPIOB->CRH|=0X22220000; //PORTB12 13 14 15推挽輸出
- }
- void MiniBalance_PWM_Init(u16 arr,u16 psc)
- {
- MiniBalance_Motor_Init(); //初始化電機控制所需IO
- RCC->APB2ENR|=1<<11; //使能TIM1時鐘
- RCC->APB2ENR|=1<<2; //PORTA時鐘使能
- GPIOA->CRH&=0XFFFF0FF0; //PORTA8 11復用輸出
- GPIOA->CRH|=0X0000B00B; //PORTA8 11復用輸出
- TIM1->ARR=arr; //設定計數器自動重裝值
- TIM1->PSC=psc; //預分頻器不分頻
- TIM1->CCMR2|=6<<12; //CH4 PWM1模式
- TIM1->CCMR1|=6<<4; //CH1 PWM1模式
- TIM1->CCMR2|=1<<11; //CH4預裝載使能
- TIM1->CCMR1|=1<<3; //CH1預裝載使能
- TIM1->CCER|=1<<12; //CH4輸出使能
- TIM1->CCER|=1<<0; //CH1輸出使能
- TIM1->BDTR |= 1<<15; //TIM1必須要這句話才能輸出PWM
- TIM1->CR1=0x8000; //ARPE使能
- TIM1->CR1|=0x01; //使能定時器1
- }
復制代碼- #include "encoder.h"
- /**************************************************************************
- 函數功能:把TIM2初始化為編碼器接口模式
- 入口參數:無
- 返回 值:無
- **************************************************************************/
- void Encoder_Init_TIM2(void)
- {
- RCC->APB1ENR|=1<<0; //TIM2時鐘使能
- RCC->APB2ENR|=1<<2; //使能PORTA時鐘
- GPIOA->CRL&=0XFFFFFF00;//PA0 PA1
- GPIOA->CRL|=0X00000044;//浮空輸入
- /* 把定時器初始化為編碼器模式 */
- TIM2->PSC = 0x0;//預分頻器
- TIM2->ARR = ENCODER_TIM_PERIOD-1;//設定計數器自動重裝值
- TIM2->CCMR1 |= 1<<0; //輸入模式,IC1FP1映射到TI1上
- TIM2->CCMR1 |= 1<<8; //輸入模式,IC2FP2映射到TI2上
- TIM2->CCER |= 0<<1; //IC1不反向
- TIM2->CCER |= 0<<5; //IC2不反向
- TIM2->SMCR |= 3<<0; //SMS='011' 所有的輸入均在上升沿和下降沿有效
- TIM2->CR1 |= 0x01; //CEN=1,使能定時器
- }
- /**************************************************************************
- 函數功能:把TIM4初始化為編碼器接口模式
- 入口參數:無
- 返回 值:無
- **************************************************************************/
- void Encoder_Init_TIM4(void)
- {
- RCC->APB1ENR|=1<<2; //TIM4時鐘使能
- RCC->APB2ENR|=1<<3; //使能PORTb時鐘
- GPIOB->CRL&=0X00FFFFFF;//PB6 PB7
- GPIOB->CRL|=0X44000000;//浮空輸入
- /* 把定時器初始化為編碼器模式 */
- TIM4->PSC = 0x0;//預分頻器
- TIM4->ARR = ENCODER_TIM_PERIOD-1;//設定計數器自動重裝值
- TIM4->CCMR1 |= 1<<0; //輸入模式,IC1FP1映射到TI1上
- TIM4->CCMR1 |= 1<<8; //輸入模式,IC2FP2映射到TI2上
- TIM4->CCER |= 0<<1; //IC1不反向
- TIM4->CCER |= 0<<5; //IC2不反向
- TIM4->SMCR |= 3<<0; //SMS='011' 所有的輸入均在上升沿和下降沿有效
- TIM4->CR1 |= 0x01; //CEN=1,使能定時器
- }
- /**************************************************************************
- 函數功能:單位時間讀取編碼器計數
- 入口參數:定時器
- 返回 值:速度值
- **************************************************************************/
- int Read_Encoder(u8 TIMX)
- {
- int Encoder_TIM;
- switch(TIMX)
- {
- case 2: Encoder_TIM= (short)TIM2 -> CNT; TIM2 -> CNT=0;break;
- case 3: Encoder_TIM= (short)TIM3 -> CNT; TIM3 -> CNT=0;break;
- case 4: Encoder_TIM= (short)TIM4 -> CNT; TIM4 -> CNT=0;break;
- default: Encoder_TIM=0;
- }
- return Encoder_TIM;
- }
復制代碼
所有資料51hei提供下載:
電機速度閉環控制(代碼詳細注釋).rar
(177.07 KB, 下載次數: 238)
2018-7-27 16:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|