标题:
电机速度闭环控制STM32源码
[打印本页]
作者:
涂图图
时间:
2019-3-11 20:45
标题:
电机速度闭环控制STM32源码
电机速度闭环控制案列
单片机源程序如下:
#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 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-3-12 01:12
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1