一种定力夹具控制系统

该博客介绍了基于STM32单片机的机械手控制系统,利用PID算法实现力保持不变的功能。系统采用应变式力传感器、无刷电机和减速器,以及滚珠丝杠传动。在软件方面,使用了卡尔曼滤波增强传感器数据,但遇到了参数调整困难和运算速度慢的问题。此外,系统通过按键控制机械手的动作,包括加紧、松开、紧急停止和自动模式,并集成了定时器和中断服务程序。

题目背景:

涉及一款加持力保持不变的机械手,有参数要求,这里只展示原理。

解决方案:

采用离传感器和PID算法,单片机为STM32F4系列,力传感器采用应变式,电机采用无刷电机加减速器。控制效果好。机械上采用滚珠丝杠传动,非标零件3D打印。
传感器做了卡尔曼滤波,不过参数调不好,运算速度还慢。

图片效果:

实物图片丢失,只剩模型了,模型中只有一个机械手,另一个对称,没有画出。
在这里插入图片描述

代码:

需要引入arm的数学库,想加速运算,还可以开启浮点运算单元。

主函数

初始化一些外设,按键、电机、压力传感器。

#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "key.h"
#include "motor.h" 
#include "sensor.h"
#include "timer.h"
#include "arm_math.h"
u16 EXPECT=2000;
extern float32_t xkh;	
int main(void)
{
   
   	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	uart_init(115200);	
	delay_init(168);	
	printf("kaishi\r\n");
	motorinit();
	Init_HX711pin();	
	delay_ms(500);
	Get_Maopi(); 
	manualoperation_init();  //手动操作相关初始化
	automode_init();	
//	KEY_Init(); //忘了啥程序了  好像没用
//	motorstart();  //这是回零程序
//	limitswitch_init();
	TIM3_Int_Init(1000-1,8400-1);	//定时器时钟84M,分频系数8400,所以84M/8400=10Khz的计数频率,计1000次为100ms
	printf("kai123shi\r\n");
  while(1)
		{
   
   
//			Get_Weight();
//			motorpid();
			printf("F=%d,PWM=%d,E=%d\r\n",zout,pwmout,iError);
			delay_ms(10);	
		}
}

按键的初始化

设置了四个按键,分别控制:加紧、松开、紧急停止、自动加紧。
key.c

#include "key.h"
#include "delay.h" 
#include "motor.h" 
#include "timer.h"
#include "sensor.h"
#include  "usart.h"
//按键初始化函数
void KEY_Init(void)
{
   
   
	GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE时钟
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //KEY0 KEY1 KEY2对应引脚
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
} 
void manualoperation_init(void)
{
   
   
	GPIO_InitTypeDef   GPIO_InitStructure;
	NVIC_InitTypeDef   NVIC_InitStructure;
	EXTI_InitTypeDef   EXTI_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA,GPIOE时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOA,GPIOE时钟
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_2;//对应引脚PA0~2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;//下拉  (不一定 要看买回来的按键模块)
  GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化GPIOA0
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//对应引脚PA0~2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;//下拉  (不一定 要看买回来的按键模块)
  GPIO_Init(GPIOC, &GPIO_InitStructure);  //初始化GPIOA0
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource2);//PA3 连接到中断线3
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource1);//PA1 连接到中断线4
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource3);//PA0 连接到中断线0
  /* 配置EXTI_Line0 */
  EXTI_InitStructure.EXTI_Line = EXTI_Line3|EXTI_Line1|EXTI_Line2 ;//LINE0~2
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发 
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0
  EXTI_Init(&EXTI_InitStructure);//配置
	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中断3  急停
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清欢_小铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值