KissFire

A blog to record daily life and share development notes.

PID Introduction

The model of PID controller

Where u is the output of PID controller and e is the error of reference and feedback. Kp, Ki and Kd are the parameters of controller, which represents propotion, integral and derivative.

Read more »

基本语法与规则

Makefile 描述的是文件编译的规则,一条规则主要由两部分组成,依赖关系和命令:

1
2
targets : prerequisites
command
  • targets: 规则的目标,可以是.o,可以是可执行文件,还可以是一个标签
  • prerequisites: 生成目标的依赖文件,可以是多个或者没有
  • command: make时需要执行的命令,可以是任意的shell命令,可以有多条命令,每条命令占一行。
Read more »

功能需求

最近项目中需要在嵌入式Linux系统中直接控制步进电机,需要开发Linux系统下的步进电机驱动,实现控制步进电机向前,向后运动指定步数的驱动API接口。每个步进电机有三个硬件接口,一个使能IO口通过电平控制步进电机的使能, 一个方向控制IO口通过电平控制步进电机的运动方向,一个PWM驱动接口驱动电机运动。在项目中的设备需要同时控制多个步进电机,因此开发的驱动也需要支持多个步进电机设备同时挂载。

分析

步进电机在Linux中属于字符设备,控制步进电机的运动(向前,或向后)和停止等API可以通过实现字符设备的文件操作函数来实现。这里选择实现文件操作中的ioctl函数,通过定义ioctl不同的命令来对应我们需要的不同操作。当然也可以通过字符设备文件的写函数write来实现,通过向步进电机的字符设备文件中写入相应的命令实现需要的操作。

其次,针对驱动程序需要同时支持多个步进电机的需求,可以采用设备树加platform总线的形式。将步进电机挂载到platform总线上,通过platform的probe函数自动解析设备树文件,得到挂载的步进电机设备信息,从而根据设备树文件中的定义加载指定数量的驱动,配置好驱动需要用到的硬件资源。

设备树文件的编写

前面提到了每个步进电机有三个硬件接口需要指定,其中包括1个使能GPIO口,1个方向GPIO口,1个PWM输出。这里PWM输出可以直接使用硬件PWM模块,也可以通过软件定时器去控制GPIO口实现模拟PWM功能。

因此设备树文件中对于一个步进电机的定义如下:

1
2
3
4
5
6
7
8
9
10
\ {
stepper_motor {
compatible = "stepper-motor";
status = "okay";
enable-gpio = <&gpio0 0 GPIO_ACTIVE_HIGH>;
direction-gpio = <&gpio0 1 GPIO_ACTIVE_HIGH>;
pwm = <&pwm0 0 1000000 0>; // 使用硬件PWM模块
// pwm-gpio = <&gpio0 2 GPIO_ACTIVE_HIGH>; // 使用GPIO模拟PWM
};
};
Read more »

Qt5虚拟键盘功能的实现

在树莓派上使用Qt开发触摸屏UI软件时,由于使用触摸屏不使用物理键盘,在需要进行文本输入时需要在UI软件中提供虚拟键盘功能。在Qt5中有两种方式提供虚拟键盘功能,一种是自己按照自己的需求开发相应的虚拟键盘模块,这种方式可定制性强,灵活性好,但是需要自己做很多开发调试工作。另一种就是直接使用Qt5提供的QVirtualKeyboard虚拟键盘模块,这种方式直接使用qt官方提供的虚拟键盘模块,省去了自己开发的工作,同时官方的虚拟键盘模块整体UI设计还是不错的。

在Qt中使用官方虚拟键盘模块的步骤如下:

  1. 首先要确认系统中已经安装了Qt5对应的虚拟键盘模块,debian系统下可以用如下指令安装:

    1
    sudo apt-get install libqt5virtualkeyboard5-dev
  2. 在Qt工程配置文件(.pro文件)中引用虚拟键盘模块:

    1
    2
    // 在.pro文件开始处添加
    Qt += virtualkeyboard
  3. 在main函数的最开始将整个工程的输入模块环境变量定义为虚拟键盘模块:

    1
    2
    // main函数开始处添加qt输入模块环境变量
    qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard"));
  4. 在需要调用虚拟键盘中的控件中设置输入模式

    输入控件(QLineEdit, QSpinBox等)有多种输入方式(InputMethodHints)可以设置,可以直接通过UI设计器或者代码的方式对相应的输入空间的输入方式进行设置。下面列出了常用的几种,具体可以参考Qt官方文档:

    Read more »

问题来源

由于在项目中需要用到E2PROM来保存一个浮点型数据,E2PROM读写的驱动都是按照字节来读写的,所以需要将float数据类型转换为字节序列,再写入E2。同理读取float数据时也要先读出字节序列,然后转换为float类型数据。

原程序

开始编写时图代码简单,直接使用指针强制类型转换的方式,代码如下:

Read more »

C++泛型编程—-模板

泛型程序设计(generic programming)是一种算法在实现时不指定具体要操作的数据的类型的程序设计方法。所谓“泛型”,指的是算法只要实现一遍,就能适用于多种数据类型。泛型程序设计方法的优势在于能够减少重复代码的编写。

为了实现泛型编程, C++中支持模板的概念.模板就是将数据类型也作为一个参数传递到具体的算法实现中(类型参数化),这样就实现了算法和数据类型的分离,即针对不同的数据类型,同一个模板都能正确处理.

Read more »
0%