电机速度闭环控制案列
单片机源程序如下:
- #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)
|