题目背景:
涉及一款加持力保持不变的机械手,有参数要求,这里只展示原理。
解决方案:
采用离传感器和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

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

3530

被折叠的 条评论
为什么被折叠?



