FOC 电流采样
采样点
在基尔霍夫定律下,三相电流的合应该等于 0,因此只需要获取亮相电流就可以重构出完整的三相电流。
对于 STM32 一般通过高级定时器的 channel4 作为 ADC 的触发源,对于下桥臂电流采样,需要在下桥臂 MOS 管导筒的时候才能去采样,而且需要在 MOS 管导通时间以及电流稳定后才能采样到比较可靠的电流。
当 Δ1\Delta_1Δ1 大于两倍的 Tdead+Ton+Tring+TconvT_{dead} + T_{on} + T_{ring} + T_{conv}Tdead+Ton+Tring+Tconv 那么在 PWM Freq Middle 时刻出发 ADC 转换也是足够转换 3 相中任意的一相。
当 Δ1\Delta_1Δ1 大于Tdead+Ton+Tring+TconvT_{dead} + T_{on} + T_{ring} + T_{conv}Tdead+Ton+Tring+Tconv 那么从 CCRmax 之后开始转换也是可以转换 3 相中任意的一相。
当 Δ2\Delta_2Δ2 > Δ0\Delta_0Δ0 > ...
差速轮运动学解算
差速轮运动学模型
机器人坐标系下的变换
运动特性为两轮差速驱动,其底部后方两个同构驱动轮的转动为其提供动力,前方的随动轮起支撑作用并不推动其运动,如下图两轮差速驱动示意图所示。
机器人的运动简化模型如图 4-1 所示,X 轴正方向为前进、Y 轴正方向为左平移、Z 轴正方向为逆时针。机器人两个轮子之间的间距为 D,机器人 X 轴和 Z 轴的速度分别为:VxV_xVx和VzV_zVz ,机器人左轮和右轮的速度分别为:VlV_lVl 和VrV_rVr。
假设机器人往一个左前的方向行进了一段距离,设机器人的右轮比左轮多走的距离近似为 K, 以机器人的轮子上的点作为参考点做延长参考线,可得:θ1=θ2θ_1 = θ_2θ1=θ2 。由于这个ΔtΔ_tΔt 很小,因此角度的变化量θ1θ_1θ1 也很小,因此有近似公式:
θ2≈sin(θ2)=KD\theta_{2} \approx \sin \left(\theta_{2}\right)=\frac{K}{D}
θ2≈sin(θ2)=DK
由数学分析可以得到下面的式子:
\begin{equation}
\math ...
Valgrind 检测 C++内存泄漏
Valgrind 的介绍
Valgrind 可以用来检测程序是否有非法使用内存的问题,例如访问未初始化的内存、访问数组时越界、忘记释放动态内存等问题。在 Linux 可以使用下面的命令安装 Valgrind:
123456$ wget ftp://sourceware.org/pub/valgrind/valgrind-3.13.0.tar.bz2$ bzip2 -d valgrind-3.13.0.tar.bz2$ tar -xf valgrind-3.13.0.tar$ cd valgrind-3.13.0$ ./configure && make$ sudo make install
检测内存泄漏
C 语言
Valgrind 可以用来检测程序在哪个位置发生内存泄漏,例如下面的程序:
123456#include <stdlib.h>int main(){ int *array = malloc(sizeof(int)); return 0;}
编译程序时,需要加上-g 选项:
1$ gcc -g -o main_c main.c
使用 ...
应用崩溃调试分析
前言
应用崩溃,各种空指针等大概是应用开发过程中最常遇到的问题了。而我们传统的调试利器 syslog 能快速解决 90%的问题,但是对于那些低概率,需要老化几十小时才能复现到的问题通过 syslog 就很难定位到问题了。这时如果可以提供一种情景再现的方式将应用崩溃现场的调用栈以及栈内数据给展现出来那么对于我们定位问题是大有帮助的。而笔者最近就遇到大量这种(基本都是老化过程中遇到的低概率)问题,于是这里尝试提供一种方法来快速定位问题。当然这类问题都是一个路子,掌握这种分析方法以后遇到这类问题就都可以轻松处理了。
本文提供的一种解决方案是通过 gdb+core dump 文件分析调试方法,具体如下:
开启 core dump 功能
在 init 脚本的 start_service 中添加
1procd_set_param limits core="unlimited"
这样一条代码,例如 xxxapp 中的添加如下:
或者直接在 shell 中执行:
12ulimit -c unlimitedecho "/tmp/core-%e-%p-%t" > /proc/sys/kern ...
C/C++内存泄露分析过程
前言
最近在工作中遇到了一些内存泄露问题,虽然泄露速度很慢,但是对于小型嵌入式设备而言资源本身就很紧张而且过 72h 老化测试过不了。于是寻找一些内存泄露检测工具辅助查找内存泄露问题,此处只使用了 leaktracer 这个开源库来帮助查找内存泄露问题。
leaktracer 概述
LeakTracer 是在检查 C/C++ 程序内存泄漏时编写的一个小工具。
要使用 LeakTracer,请使用提供的 LeakCheck 脚本运行您的程序。它使用 LD_PRELOAD 特性在你的函数之上“覆盖”一些函数(不需要重新编译)。如果您的平台不支持 LD_PRELOAD,您可以将 LeakTracer.o 对象文件添加到 Makefile 中的对象并运行您的应用程序。
LeakTracer 利用 gdb 去输出发生内存泄露所发生的位置,它是通过 override operator new, operator delete, operator malloc, operator free 来实现检测。
用法
加载 leaktracer 库的 3 种方法:
将您的程序链接到 liblea ...
一个 oops 分析实例
最近出现了比较多的内核崩溃的问题,之前也曾转发过网上一篇关于内核崩溃问题的跟踪方法,我在这里借 xxx 提供的这个死机现场,再给大家描述一下这类问题的分析方法和 debug 过程,也希望能让大家真正掌握这类问题的调试方法。让大家明白,内核崩溃问题的调试方法其实也就是这样一些固定的套路。问题的分析过程如下:
确认死机现场
12345678910111213[56400.437450] Unable to handle kernel paging request at virtual address f7fe44a1[56400.440040] pgd = d112c000[56400.440040] [f7fe44a1] *pgd=00000000[56400.440040] Internal error: Oops: 5 [#1] PREEMPT SMP ARM[56400.440040] Modules linked in: 8188eu gt82x mma8452 rtl8150 mcs7830 qf9700 asix sunxi_keyboard sw_device vfe_ ...
概率论与数理统计
原图
概率论基本概念
概率的派别
对于概率的定义有几个主流的派别:
频率派:
频率派认为如果频率存在稳定性,即当n→∞n\to\inftyn→∞时下面极限存在(下面这个写法只是示意,后面介绍大数定律的时候会给出严格的定义),就得到了概率(用 Probability 的首字母 P 来表示):
P(正面)=limn→∞Pn(正面)P(正面)=\lim_{n\to\infty}P_{n}(正面)
P(正面)=n→∞limPn(正面)
古典派:
如果因为无知,使得我们没有办法判断哪一个结果会比另外一个结果更容易出现,那么应该给予它们相同的概率,此称为不充分理由原则(Insufficient Reason Principle)。以不充分理由原则为基础,经由拉普拉斯:之手,确立了古典概率的定义,即:
未知的概率都为等概率
主观派:
最后介绍下主观派,主观派认为概率是信念强度(degree of belief)。比如说,我个人相信 20 年后人类从网络时代进入人工智能时代的概率为 70%.
三个流派大概有以下的区别:
频率派古典派主观派理论基础过往事实的归纳总结、qua ...
线性代数
原图
向量空间
向量
n 个有序的数a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an所组成的数组称为nnn 维向量,这nnn个数称为该向量的nnn个分量,第iii个数aia_iai称为第iii个分量。nnn维向量可写成一行,也可写成一列。分别称为行向量和列向量:
n 维列向量:
(a1a2⋮an)\begin{pmatrix}a_1\\a_2\\\vdots\\a_n\end{pmatrix}
⎝⎜⎜⎜⎜⎛a1a2⋮an⎠⎟⎟⎟⎟⎞
与 n 维行向量:
(a1,a2,...,an)或、quad(a1a2⋯an)(a_1,a_2,...,a_n)\quad 或、quad \begin{pmatrix}a_1&a_2&\cdots&a_n\end{pmatrix}
(a1,a2,...,an)或、quad(a1a2⋯an)
nnn也称为该向量的维数。
向量的基本运算法则
\begin{array}{c|c}
\hline
\\
\quad 加法、quad ...
微积分(下)
原图
多元函数微分
多元函数及其邻域
二元函数的严格定义:
假设DDD是二维向量(x,y)(x,y)(x,y)的集合,DDD上的二元函数 f\ f f是一个映射法则,它对DDD内的每一个有序对(x,y)(x,y)(x,y)指定唯一的一个实数:
z=f(x,y),(x,y)∈Dz=f(x,y),\quad (x,y)\in D
z=f(x,y),(x,y)∈D
如果用PPP来代替(x,y)(x,y)(x,y)的话,也可以写作:
z=f(P),P∈Dz=f(P),\quad P\in D
z=f(P),P∈D
DDD称为fff的定义域,x、yx、yx、y(或(x,y)(x,y)(x,y),或PPP)称为fff的自变量,zzz称为fff的因变量。
如果定义域DDD是更高维的向量的集合,也就是说自变量为更高维的向量,那么
fff可以称为多元函数,也叫作多变量函数。
邻域和去心邻域:
二维向量的邻域要比一维向量的复杂。对于二维向量P0(x0,y0)P_0(x_0,y_0)P0(x0,y0)而言,半径为δ\deltaδ 邻域可以表示为平面点集:
U(P0,δ)= ...
微积分(上)
原图
极限
魏尔斯特拉斯的数列极限
设xn{x_n}xn为一数列,如果存在实数 L,对于任意给定的正实数ϵ\epsilonϵ(不论它多么小),总存在正整数 N,使得对所有的 n > N 时,有:
∣xn−L∣<ϵ\left|x_{n}-L\right|<\epsilon
∣xn−L∣<ϵ
那么就称 L 是数列xn{x_n}xn的极限,或者称数列xn{x_n}xn收敛于 L,记为:
limn→∞xn=L\begin{gathered}
\lim _{n \rightarrow \infty} x_{n}=L
\end{gathered}
n→∞limxn=L
或
xn→L(n→∞)\begin{gathered}
x_{n} \rightarrow L(n \rightarrow \infty)
\end{gathered}
xn→L(n→∞)
一般函数的极限定义
设函数 f(x) 在U˚(x0)\mathring{U}(x_0)U˚(x0)上有定义。
如果存在常数 L,对任意给定的正数ϵ\epsilonϵ(不论它多么小),总存在 ...

)