電機速度閉環控制案列
單片機源程序如下:
- #include <stdlib.h>
- #include <string.h>
- #include "stm32f10x.h" //包含stm32庫系統頭文件
- #include "servor.h" //包含GPIO庫頭文件
- #include "usart.h" //包含串口通信設置頭文件
- #include "delay.h" //包含系統定時器庫頭文件
- #include "timer.h" //包含定時器設置頭文件
- #include "PS2.h"
- #include "key.h"
- #include "led.h"
- #include "beep.h"
- #include "common.h"
- #include "adc.h"
- #include "motor.h"
- #include "control_app.h"
- #include "oled.h"
- #include "show.h"
- #include "encoder.h"
- u32 value;
- u32 key, key_bak;
- extern u32 a; //a用來計數,配合系統滴答定時器可檢測代碼運行時間
- extern uint8 flag_RecFul;
- int Encoder_Left,Encoder_Right; //左右編碼器的脈沖計數
- int Motor_A,Motor_B,Servo,Target_A,Target_B; //電機舵機控制相關
- int Encoder_A_EXTI;
- uint16 CPWM[MOTOR_NUM]= {1500,1500,1500,1500,1500,1500,1500,1500,1500};
- char redata[500] = {0}; // 定義接收數據變量數組
- uint16 adc_value=0;
- unsigned char flag_scan_ps2 = 0;
- u8 LX_AD=0;
- u8 LY_AD=0;
- u8 RX_AD=0;
- u8 RY_AD=0;
- u32 Motor_Pwm=990;
- u8 ps2_mode=0;
- char menu=2;
- u8 delay_50,delay_flag;
- void scan_ps2(void);
- void Check_Power(void);
- void ps2_handle(void);
- /**********************************************************************************/
- /*****************************主函數***********************************************/
- int main(void)
- {
- SysTick_Init(); //系統滴答定時器初始化
- Servor_GPIO_Config(); //GPIO初始化
- Uart_Init(2);
- Uart_Init(3);
- Timer_Init(); //定時器初始化
- Timer_ON(); //開啟定時器
- LED_Init();
- //KEY_Init();
- // Beep_Init();
- Uart_Init(1);
- // PS2_Init();
- OLED_Init(); //=====OLED初始化
- Encoder_Init_TIM3();
- Encoder_Init_TIM_Exit0();
- Encoder_Init_TIM_Exit1();
- //Adc_Init();
- USART_Config(USART1,115200);
- USART_Config(USART2,115200);
- USART_Config(USART3,115200);
- Motor_Gpio_init();
- // PWM2_Init(1000,5); // 初始化電機工作頻率 72/(5+1) 12KHZ
- PWM2_Init(7199,0); // 初始化電機工作頻率 72/(5+1) 12KHZ
- //Led_Test();
- //Beep_Test();
- while (1)
- {
- oled_show(); //===顯示屏打開
- delay_flag=1;
- delay_50=0;
- while(delay_flag); //通過定時中斷實現的50ms精準延時
- }
- }
- /*
- void ps2_handle(void) {
- //ps2_SONY
- Delay_ms(85);
- flag_scan_ps2=1;
-
- }
- */
- void scan_ps2(void)
- {
- if (flag_scan_ps2)//
- {
- flag_scan_ps2 = 0;
- key = PS2_DataKey();
- LX_AD=PS2_AnologData(PSS_LX);
- RY_AD=PS2_AnologData(PSS_RY);
- //UART_Put_Inf("LY_AD:",LY_AD);
- ps2_mode=PS2_RedLight();
- if(ps2_mode==0)
- {
- if(key==PSB_SELECT)
- {
- if(key_bak == key)return;
- key_bak=key;
- menu=0;
- N_Beep(1);
- }
- if(key==PSB_START)
- {
- if(key_bak == key)return;
- key_bak=key;
- menu=1;
- N_Beep(1);
- }
- if(menu==0)
- {
- switch(key)
- {
- case PSB_PAD_UP:break;
- case PSB_PAD_DOWN:break;
- case PSB_PAD_LEFT:break;
- case PSB_PAD_RIGHT:break;
-
- case PSB_TRIANGLE:break;
- case PSB_CROSS:break;
- case PSB_PINK:break;
- case PSB_CIRCLE:break;
- case PSB_L1:N_Beep(1);Motor_Pwm+=200;if(Motor_Pwm>=990) Motor_Pwm=990;break;
- case PSB_L2:N_Beep(1);Motor_Pwm-=200;if(Motor_Pwm<=600) Motor_Pwm=600;break;
- case PSB_R1:break;
- case PSB_R2:break;
- default:break;
- }
- //LY_AD=PS2_AnologData(PSS_LY);
- //RY_AD=PS2_AnologData(PSS_RY);
- if(LX_AD>110 && LX_AD<=146) //左搖桿y軸在ad值在:100--146范圍內讓電機保持停止狀態
- {
-
- CPWM[1]=1500;
- }
- else if(LX_AD>=0 && LX_AD<=110)
- {
- CPWM[1]=1100;
- }
- else if(LX_AD>146 && LX_AD<=255)
- {
- CPWM[1]=1900;
- }
- if(RY_AD>110 && RY_AD<=146) //左搖桿X軸在ad值在:100--146范圍內,讓舵機保持在1500中間位置
- {
- Set_Pwm_Motor1(0);
- Set_Pwm_Motor2(0);
- }
- else if(RY_AD>=0 && RY_AD<=110)
- {
- Set_Pwm_Motor1(Motor_Pwm);
- Set_Pwm_Motor2(Motor_Pwm);
- }
- else if(RY_AD>146 && RY_AD<=255)
- {
- Set_Pwm_Motor1(-Motor_Pwm);
- Set_Pwm_Motor2(-Motor_Pwm);
- }
- }
- }
- }
- }
復制代碼
所有資料51hei提供下載:
2.電機速度閉環控制.7z
(206 KB, 下載次數: 14)
2019-3-12 01:12 上傳
點擊文件名下載附件
|