一、无刷电机的控制原理
对电机的控制实际上是对MOS管开关规律的控制,而MOS管开关规律是单片机程序控制的,FOC控制就是一种对电机运动模型进行抽象和简化,进而有规律控制各个MOS管开关通断的过程。
二、FOC软件控制原理
FOC算法就是磁场定向控制算法,而克拉克变换和帕克变换就是磁场定向控制算法的核心。
2.1. 克拉克变换
克拉克变换,就是降维解耦的过程,把难以辨明和控制的三相相位差120°电机波形降维为两维矢量;
对电机的控制实际上是对MOS管开关规律的控制,而MOS管开关规律是单片机程序控制的,FOC控制就是一种对电机运动模型进行抽象和简化,进而有规律控制各个MOS管开关通断的过程。
FOC算法就是磁场定向控制算法,而克拉克变换和帕克变换就是磁场定向控制算法的核心。
克拉克变换,就是降维解耦的过程,把难以辨明和控制的三相相位差120°电机波形降维为两维矢量;
想要实现电机的位置控制,首先要准确读出编码器的值,增量编码器有AB两相,AB相永远有90度的相位差,波形图如图所示:
以上升沿为一个周期的起点,如果B相比A相快90度对应的应该是逆时针旋转,此时编码器向下计数;如果A相比B相快90度对应的应该是顺时针旋转,此时编码器向上计数。
常规的方法,我们只测量 A 相(或 B 相)的上升 沿或者下降沿,也就是上图中对应的数字 1234 中的某一个,这样就只能计数 3次。而四倍频的方法是测量 A 相和 B 相编码器的上升沿和下降沿。这样在同样的 时间内,可以计数 12 次(3 个 1234 的循环)。这就是软件四倍频的原理。 STM32编码器配置如图所示:
先看原程序,下面这段代码是串口中断发生之后执行的方法。在STM32上,串口每收到一个字节的数据就会触发一次中断,中断触发后,HAL库自动帮我们把接收缓冲区的数据复制到了aRxBuffer[0]当中。
程序当中首先新建了一个接收缓冲区USART_RX_BUF和flag USART_RX_STA。
当缓冲区的数据到达指定长度并且是以0XFF开头时,则USART_RX_STA最高位置1,此时消费者需要处理数据。
当消费者处理完成数据后,USART_RX_STA最高位置0,此时生产者可以继续接收串口数据。
使用freeRTOS的唯一硬性要求是内存要足够大,可以随便造。系统总堆太大或太小都有可能卡死,这个问题以后再深究。
串口空闲中断处理函数:当串口空闲中断发生时,负责将串口接收DMA中的数据发送至串口消息队列,然后等待下一次空闲中断的产生。
主任务:在 freeRTOS 初始化时创建,负责创建其它的任务以及消息队列,并且以一定频率实时向上位机发送数据。
数据处理任务:负责接收来自串口消息队列的数据,以正确的通讯协议区分并解析每个数据帧,并且把解析完成的数据发送至LED消息队列。
LED控制任务:负责接收LED消息队列的数据,并控制灯带颜色。
作用:定时器中断可以提供精确定时,无论主线程在执行什么操作,只要到达设定的定时时间,定时器中断都会触发。因此,定时器中断可以确保数据帧上传的时间间隔非常精确。
TIM_HandleTypeDef htim4;
void MX_TIM4_Init(void)
{
htim4.Instance = TIM4;
htim4.Init.Prescaler = 7199; // 10K频率
htim4.Init.CounterMode = TIM_COUNTERMODE_UP; // 递增计数器
htim4.Init.Period = 500; // 50毫秒产生一次中断
HAL_TIM_Base_Init(&htim4);
HAL_TIM_Base_Start_IT(&htim4);
}
在上一篇文章中,我们创建了一个会崩溃的main
可执行文件:
# 创建main.cpp
cat > main.cpp <<EOF
#include <iostream>
void test(){
std::cout << "test func" << std::endl;
throw "some error";
}
int main(){
std::cout<<"main started!"<<std::endl;
test();
return 0;
}
EOF
# 编译成可执行文件
g++ -g -o main main.cpp
GDB
是GNU Project Debugger
简称,是一个调试器。官网介绍说:
(GDB) allows you to see what is going on `inside' another program while it executes -- or what another program was doing at the moment it crashed. 可以看到软件里面发生了什么,或者崩溃时在干什么。
安装:
sudo apt install gcc-arm-none-eabi
命令名称 | 作用 |
---|---|
git config --gloval user.name 用户名 | 设置用户签名 |
git config --global user.name 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m "日志信息" 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset --hard 版本号 | 版本穿梭 |
先去官网下载离线安装包,将离线安装包与离线安装脚本放在同一目录下,确定脚本中的DOCKER_TGZ
变量与下载的文件名称一致,此处以docker-26.0.0.tgz为例。