麦轮控制32f4

2023-10-29 14:40
文章标签 控制 麦轮 32f4

本文主要是介绍麦轮控制32f4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

#include "motor.h"
double CNT_10ms[4]={0};//每5ms脉冲数
double CNT_10ms_old[4]={0};
static void Dis_Gpio_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOGPIO_SetBits(GPIOE,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12);
}
static void pwm_init(void)//GPIO_AF_TIM1,,pwm初始化 pe
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOE, ENABLE); //开启引脚时钟GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1); GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1);GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1);GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_TIM1);//复用引脚														   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_11|GPIO_Pin_13|GPIO_Pin_14;	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //开启定时器时钟TIM_TimeBaseStructure.TIM_Period = 1200-1;       TIM_TimeBaseStructure.TIM_Prescaler = 14-1;	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//初始化定时器 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;	   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	TIM_OCInitStructure.TIM_Pulse = 600-1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  	 TIM_OC1Init(TIM1, &TIM_OCInitStructure);	TIM_OC2Init(TIM1, &TIM_OCInitStructure);	TIM_OC3Init(TIM1, &TIM_OCInitStructure);	TIM_OC4Init(TIM1, &TIM_OCInitStructure);//配置pwmTIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);//使能通道重载TIM_Cmd(TIM1, ENABLE);	//开启定时器TIM_CtrlPWMOutputs(TIM1, ENABLE);
}void Encoder_init(void)//正交解码初始化
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;  RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD, ENABLE); //开启引脚时钟GPIO_PinAFConfig(GPIOA,GPIO_PinSource15,GPIO_AF_TIM2); GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_TIM2);GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_TIM8);GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_TIM8);GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5);GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5);//复用引脚		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_15;	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;	GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13;GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2|RCC_APB1Periph_TIM4|RCC_APB1Periph_TIM5, ENABLE); //开启定时器时钟TIM_TimeBaseStructure.TIM_Period = 0xffff;       TIM_TimeBaseStructure.TIM_Prescaler = 1-1;	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);//初始化定时器TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);TIM_EncoderInterfaceConfig(TIM5, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge ,TIM_ICPolarity_BothEdge);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = 0;TIM_ICInit(TIM2,&TIM_ICInitStructure);TIM_ICInit(TIM8,&TIM_ICInitStructure);TIM_ICInit(TIM4,&TIM_ICInitStructure);TIM_ICInit(TIM5,&TIM_ICInitStructure);//配置正交解码TIM_Cmd(TIM2, ENABLE);	TIM_Cmd(TIM8, ENABLE); TIM_Cmd(TIM4, ENABLE); TIM_Cmd(TIM5, ENABLE); //开启定时器TIM2->CNT=0;TIM8->CNT=0;TIM4->CNT=0;TIM5->CNT=0;
}void Get_Encoder(void)
{s16 temp;temp=(s16)((u16)(TIM2->CNT));CNT_10ms[0]=(double)temp*0.95+CNT_10ms_old[0]*0.05;CNT_10ms_old[0]=CNT_10ms[0];TIM2->CNT=0;temp=-(s16)((u16)(TIM8->CNT));CNT_10ms[1]=(double)temp*0.95+CNT_10ms_old[1]*0.05;CNT_10ms_old[1]=CNT_10ms[1];TIM8->CNT=0;temp=-(s16)((u16)(TIM4->CNT));CNT_10ms[2]=(double)temp*0.95+CNT_10ms_old[2]*0.05;CNT_10ms_old[2]=CNT_10ms[2];TIM4->CNT=0;temp=(s16)((u16)(TIM5->CNT));CNT_10ms[3]=(double)temp*0.95+CNT_10ms_old[3]*0.05;CNT_10ms_old[3]=CNT_10ms[3];TIM5->CNT=0;
}void motor_control(void)//电机控制
{TIM1->CCR3=motor_1.motor_uk+600;TIM1->CCR4=-motor_2.motor_uk+600;TIM1->CCR2=-motor_3.motor_uk+600;TIM1->CCR1=motor_4.motor_uk+600;
}
void Enable_Motor(void)
{GPIO_ResetBits(GPIOE,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12);
}
void Disenable_Motor(void)
{GPIO_SetBits(GPIOE,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12);
}
void Motor_Init(void)
{Dis_Gpio_Init();pwm_init();    Encoder_init();
}void Mecanum_Wheel_Motor_Calculate(float front_back,float left_right,float clockwise_anticlockwise)
{float duty[4]={0};duty[0]+=front_back;duty[1]+=front_back;duty[2]+=front_back;duty[3]+=front_back;duty[0]+=left_right;duty[2]+=left_right;duty[1]-=left_right;duty[3]-=left_right;duty[0]+=clockwise_anticlockwise;duty[3]+=clockwise_anticlockwise;duty[1]-=clockwise_anticlockwise;duty[2]-=clockwise_anticlockwise;motor_1.motor_point=duty[0];motor_2.motor_point=duty[1];motor_3.motor_point=duty[2];motor_4.motor_point=duty[3];
}

这篇关于麦轮控制32f4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/301328

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

【电机控制】数字滤波算法(持续更新)

文章目录 前言1. 数字低通滤波 前言 各种数字滤波原理,离散化公式及代码。 1. 数字低通滤波 滤波器公式 一阶低通滤波器的输出 y [ n ] y[n] y[n] 可以通过以下公式计算得到: y [ n ] = α x [ n ] + ( 1 − α ) y [ n − 1 ] y[n] = \alpha x[n] + (1 - \alpha) y[n-1]

OpenStack离线Train版安装系列—3控制节点-Keystone认证服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack离线Train版安装系列—1控制节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack离线Train版安装系列—10.控制节点-Heat服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack Victoria版——7.1控制节点-Neutron网络服务组件

7.1控制节点-Neutron网络服务组件 更多步骤:OpenStack Victoria版安装部署系列教程 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版 离线安装部署系列教程(全) OpenStack Train版 离线安装部署系列教程(全) 欢迎留言沟通,共同进步。 文章目录 一、创建n