自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(202)
  • 收藏
  • 关注

原创 LVGL LED、列表、下拉列表、滚轮、滑块部件

Tips:打开、关闭LED时,亮度不绝对是255、0,具体要看相关的宏定义(可修改)。滑块部件常用于调节某个参数的值,它以直线滑动的形式来修改数值。滚轮部件常用于多选一的场景,它以滚轮的形式来展现多个选项。下拉列表部件常用于多选一的场景,点击后可展现多个选项。列表部件常用于多选一的场景,默认会展现多个选项。LED部件常用于指示控制对象的状态。

2024-05-22 19:59:12 339

原创 LVGL标签、按钮、开关、复选框、进度条、加载器部件

默认情况下,如果没有限定标签部件大小,那它的大小自动扩展为文本大小。开关部件常用于控制某个功能的开启和关闭,它可以直接显示被控对象的状态。复选框部件常用于选中某个内容的开启和关闭,可以理解为自带标签的开关。2、文本不存储在动态内存,而是在指定的缓冲区中(在LVGL中,标签部件主要用于文本显示,例如标题、提示信息等。在LVGL中,按钮部件与基础对象相比,没有新增任何功能。进度条部件常用于显示当前任务的完成进度。加载器部件常用于提示当前任务正在加载。

2024-05-22 00:34:38 735

原创 LVGL基础对象

部件的组成,这部分的内容可以在lvgl官网Docs-Widgeets进行查看,官网温馨提供中文翻译。设置X轴坐标:lv_obj_set_x(obj, new_x);设置Y轴坐标:lv_obj_set_y(obj, new_y);基础对象(lv_obj)可以作为父对象来创建其它对象,同时也可作为部件使用。LVGL采用的是面向对象的编程思想,以抽象的类来实例化不同的对象(部件)。LVGL中,当发生用户感兴趣的事情时,可以触发回调事件,以执行相关的操作。2、子对象的位置超出父对象的范围,则超出的部分不显示。

2024-05-21 20:10:17 461

原创 LVGL模拟器

编译报错多数是内置Mingw版本太低,百度找路径下载更新原位置即可。先删除CodeBlocks/MinGW/内的所有内容,然后将新的MinGW/内的所有内容放进去。选择MinGW下载:x86_64-13.2.0-release-posix-seh-ucrt-rt_v11-rev.7z。软件版本:codeblocks-20.03mingw-setup(必须是20.03版本以上,且是mingw工具集)Linux、Mac平台:VSCode、Eclipse、PlatformIO。

2024-05-20 16:16:46 267

原创 LVGL移植

lv_conf.h文件内容介绍:第12讲 基础篇-LVGL移植(配置文件介绍1)_哔哩哔哩_bilibili序号板块介绍功能描述1颜色颜色深度、字节交换、屏幕透明等2内存内存管理算法选择、内存分配大小等3硬件层显示刷新周期、输入设备读取周期等4特征绘图、日志、帧率显示等5编译器(不重要)大数组前缀、内存对齐等6字体开启系统字体、配置自定义字体等7文本(不重要)字符编码、文本特性8核心部件使能/失能核心部件9扩展功能使能/失能扩展部件、第三方库等。

2024-05-19 17:41:21 625

原创 STM32-LCD液晶屏(ILI9341)

内部结构复杂。芯片中含有GRAM(即显存),GRAM中每个存储单元都对应液晶面板的一个像素点。通过液晶控制器内部各种模块共同作用把GRAM存储单元的数据转化为液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为了一幅完整的图像。ILI9341液晶控制器根据自身的IM[3:0]信号线电平决定了它与MCU的通讯方式支持SPI、8080通讯方式。野火指南者中固定搭配8080(内部硬件电路处理)使用16根数据线的RGB565格式。即当时,MCU接口模式为。

2024-05-13 15:22:34 746

原创 STM32移植嵌入式开源按键框架

MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。

2024-04-15 15:59:07 1003

原创 电机应用-步进电机进阶驱动

假设该装置使用步进电机实现物体X的移动,系统要求从A点出发,到B点停止,移动的且。根据步进电机的特性,最大程度加大电机转速(提高脉冲频率),则到达B点的时间就越短,但是如果施加脉冲频率过高,超过了步进电机的最小启动频率,则会造成电机内部的反向电动势的阻尼作用,转子与定子之间的磁反应将跟随不上电信号的变化,导致堵转或者丢步,滑块连动都没动。

2024-03-11 18:06:38 948

原创 电机应用-正点原子直流有刷电机例程笔记

在TIM6中1ms进入一次中断,中断记录编码器值(相当于总的计数值),然后进行电机速度计算(用到冒泡排序和一阶低通滤波算法)后传值给g_motor_data.speed,单位转/分(RPM)。假设让TIM1_CH1输出PWM波,TIM1_CH1N固定输出高电平,此时只要调节TIM1_CH1输出的PWM占空比即可调整电机上的电压,进而控制电机的转速。A、B两相脉冲信号从TIMx_CH1和TIMx_CH2这两个通道输入,经过滤波器和边沿检测器(可以设置滤波和反相)的处理,进入到编码器接口控制器中。

2024-03-01 17:57:37 1100

原创 电机应用-直流有刷电机(PID)

PID是Proportional(比例)Integral(积分)Differential(微分)的首字母缩写,它是一种结合比例、积分和微分三个环节于一体的闭环控制算法。本质:根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用来控制输出。

2024-02-27 09:40:50 1202

原创 电机应用-直流有刷电机(编码器)

编码器:一种将数据转换为的设备。常用于测量物体运动的位置、角度或者速度。

2024-02-21 12:50:28 524

原创 FreeModbus--学习函数指针

C语言的函数指针是指向函数的指针变量,可以用来存储和调用函数的地址。作为函数的参数:函数指针可以作为参数传递给其他函数,使得可以在调用函数时动态指定要执行的函数。作为数组元素:可以使用函数指针数组来存储多个函数的地址,便于根据需要选择执行某个函数。作为函数的返回值:函数指针可以作为函数的返回值,返回指向函数的地址。该协议栈中使用到函数指针,现开展一篇专门存放函数指针的文章。为了更贴合协议栈的函数指针,稍加修改例子。

2023-12-14 11:15:13 582

原创 常用的C语言宏定义和常用转换函数

防止头文件被重复包含#ifndef CONDEF_H#define CONDEF_H/* 头文件内容 */#endif重新定义数据类型,防止由于各种平台和编译器的不同而产生的类型字节数差异,方便移植typedef unsigned char boolean; /* Boolean value type. */typedef unsigned long int uint32; /* Unsigned 32 bit value */typedef unsigned

2023-12-11 15:34:11 471

原创 FreeRTOS-钩子函数

vApplicationTickHook()函数在中断服务程序中执行,所以这个函数必须短而有效率,不能加延时,不能大量使用堆栈,也不能调用“FromISR”结尾的API函数。如果没有其它任务优先级和空闲任务相同,那空闲任务钩子函数里不能阻塞或挂起自身。栈溢出可能会把系统栈溢出检测代码的数据也给破坏掉了,而导致栈溢出检测失效,这时栈溢出钩子函数也就无法调用了。可以统计在一定周期时间内系统执行空闲任务的tick数,就可以获取到CPU空闲率(如1s内空闲任务运行了0.9s,则CPU占用率为10%)。

2023-12-06 12:07:19 774 3

原创 STM32-新建工程(标准库)

STM32F10x新建工程(标准库)

2023-12-05 10:45:55 546

原创 FreeRTOS-软件定时器

如果定时器已经被启动,但它的回调函数还没有被执行时,再次执行xTimerStart()函数相当于执行xTimerReset()函数,重新设定它的启动时间。定时器函数一般在中断里执行,如在中断中判断定时器是否超时,如果超时就调用回调函数。定时器的回调函数是在守护任务中被调用的,守护任务不是专为某个定时器服务的,它还要处理其他定时器。使用xTimerReset()函数可以让定时器的状态从睡眠态转换为运行态,相当于使用xTimerStart()函数。启动定时器和运行回调函数的间隔为定时器的周期。

2023-12-04 17:59:28 1088

原创 FreeRTOS-任务通知

xTaskNotifyGive / xTaskNotifyGiveFromISR都是直接给其他任务发送通知,使得通知值+1,并使得通知状态变为taskNOTIFICATION_RECEIVED,表示有数据了,待处理。使用队列、信号量、事件组时,数据保存在结构体中,其他任务、ISR都可以访问结构体的数据。使用任务通知,可以实现轻量级的队列(长度为1)、邮箱(覆盖的队列)、计数型信号量、二进制信号量、事件组。设置接收任务的通知值的某一位、某些位。使用任务通知时,任务结构体只有一个任务通知值,只能保存一个数据。

2023-12-04 12:01:18 932

原创 FreeRTOS-事件组

ISR的函数,如队列函数xQueueSendToBackFromISR、信号量函数xSemaphoreGiveFromISR,它们会唤醒某个任务,最多只会唤醒一个任务。如果configUSE_16_BIT_TICKS是0,就表示该处理器使用32位更高效,则整数是32位,低24位表示事件。如果configUSE_16_BIT_TICKS是1,就表示该处理器使用16位更高效,则整数是16位,低8位表示事件。可以等待某一位,或等待某些位的任意一个,或等待多位。每一位的值:1表示事件发生,0表示事件还没发生。

2023-11-29 18:00:39 837

原创 FreeRTOS-信号量/互斥量

二进制信号量、计数型信号量的give、take操作函数是一样的。也分两个版本:给任务使用、给ISR使用。支持的动作:give给出资源,计数值+1;take获得资源,计数值-1。vSemaphoreDelete可以用来删除二进制信号量、计数型信号量。对于动态创建的信号量,不再需要它们时,可以删除它们以回收内存。当量只有0、1时,就是二进制信号量。当量没有限制时,就是计数型信号量。创建队列时有2部分内存:队列结构体、存储数据的空间。创建信号量时,只需要分配信号量结构体。只有计数值,无法容纳其他数据。

2023-11-28 15:11:14 464

原创 FreeRTOS-队列Queue

当队列中有数据时,优先级最高的任务会先进入就绪态,同优先级时等待时间最久的任务会先进入就绪态。可使用xQueuePeek()或xQueuePeekFromISR(),这些函数会从队列中复制出数据,但是不移除数据。如果队列满则无法写入新数据,可以让任务进入阻塞状态,xTicksToWait表示阻塞的最大时间(Tick Count)。如果队列空则无法读取新数据,可以让任务进入阻塞状态,xTicksToWait表示阻塞的最大时间(Tick Count)。只要知道队列的句柄,任务、ISR都可以读、写该队列。

2023-11-27 17:57:19 397

原创 FreeRTOS-任务管理

任务1中如果不调用vTaskDelay,则空闲任务没有机会执行,也就无法释放创建任务2时分配的内存。而任务1不断地创建任务,不断消耗内存,最终会内存耗尽而无法再创建新任务。测量系统的空闲时间:空闲时间能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任务占据的时间就可以算出处理器占用率。注意:如果使用vTaskDelete()删除任务,则需确保空闲任务有机会执行,否则就无法释放被删除任务的内存。任务1继续执行,执行延时函数进入阻塞状态,轮到空闲任务执行,空闲任务释放任务2的内存(TCB、栈)。

2023-11-27 16:35:21 875

原创 FreeRTOS-FreeRTOS概述

复制通用核心文件:复制FreeRTOS/Source文件夹下的croutine.c文件、event_groups.c文件、list.c文件、queue.c文件、task.c文件、timers.c文件到freertos/src文件夹。复制移植相关文件:复制FreeRTOS/Source/portable/RVDS/ARM_CM3文件下的port.c文件、portmacro.h文件到freertos/port文件夹。因此在stm32f10x_it.c文件中注释掉3个相关的中断服务函数。

2023-11-24 17:57:42 498

原创 电机应用-直流有刷电机多环控制实现

外环的输出会作为内环的输入。外环一般是最终要控制的效果,配置基本定时器TIM6产生定时中断执行PID运算。配置高级定时器TIM1输出PWM控制电机。配置通用定时器TIM3读取编码器的计数值。编写位置环、速度环、电流环控制函数。板、野火MOS搭建的驱动板。增加上位机曲线观察相关代码。配置ADC可读取电流值。编写位置式PID算法。

2023-11-24 09:44:27 1049

原创 电机应用开发-直流有刷电机电流环控制实现

在一些场景中想让电机吊起超出电机能力的重物(即超载),但电机的能力有限,电机长期超载工作会严重损坏电机。如果想合理利用电机的性能,就需要控制电流的输出,所以需要电流环的控制。配置基本定时器产生定时中断读取当前电路中驱动电机的电流值并执行PID运算。配置基本定时器产生定时中断读取当前电路中驱动电机的电流值并执行PID运算。利用直流有刷驱动板来完成对电流的采集,最终实现电流环的闭环控制。配置定时器输出PWM控制电机。配置定时器输出PWM控制电机。增加上位机曲线观察相关代码。增加上位机曲线观察相关代码。

2023-11-23 18:05:30 594

原创 电机应用开发-直流有刷电机位置环控制实现

可以以开始为参考,记录正转多少圈或反转多少圈。如一圈脉冲为1920,刚开始目标值为0,输入目标值脉冲为1920后正转一圈,再输入目标值脉冲为1920*2后正转一圈,然后输入目标值脉冲为0即可反转两圈。配置基本定时器产生定时中断来执行PID运算。配置基本定时器产生定时中断来执行PID运算。配置定时器输出PWM控制电机。配置定时器读取编码器的计数值。配置定时器输出PWM控制电机。配置定时器读取编码器的计数值。增加上位机曲线观察相关代码。增加上位机曲线观察相关代码。编写位置式PID算法。编写增量式PID算法。

2023-11-23 16:43:11 1294

原创 电机应用开发-直流有刷电机速度环控制实现

可选:L298N电机驱动板、野火MOS搭建的驱动板。配置基本定时器可以产生定时中断来执行PID运算。配置定时器可以输出PWM控制电机。配置定时器可以读取编码器的计数值。增加上位机曲线观察相关代码。编写位置式PID算法。

2023-11-22 09:41:06 294

原创 电机应用开发-编码器的使用

建立在一个已知频率的高频脉冲并对其计数,计数时间由捕获到的编码器相邻两个脉冲的间隔时间T决定,计数值为M。而在低转速时,T足够大,测量周期内的M也足够多。在一个相对固定的时间内,计数编码器脉冲数为M0,并计数一个已知频率为F的高频脉冲,计数值为M1,设编码器单圈总脉冲数为C,则转速n = FM0/CM1。假设有个增量式编码器的分辨率是600PPR,能分辨最小角度是0.6°,对它进行4倍频后就相当于把分辨率提高到600*4=2400PPR,此时编码器能够分辨的最小角度为0.15°。

2023-11-21 11:58:18 432

原创 电机应用开发-PID控制器参数整定

采样周期越短,控制的效果越接近于连续,对于大多数算法缩短采样周期可使控制回路性能改善,但采样周期缩短时,频繁的采样会占用较多的计算工作时间,同时也会增加计算负担,而对有些变化缓存的受控对象无需很高的采样频率即可满意地进行跟踪,过多的采样反而没有多少实际意义。采样周期的选择:要根据所设计的系统的具体情况,用试凑的方法,在试凑过程中根据各种合理的建议来预选采样周期,多次试凑,选择性能较好的一个作为最后的采样周期。比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡。

2023-11-20 18:13:49 203

原创 电机应用-控制系统、PID

控制装置比较被控对象当前状态(输出量)和希望状态(给定量)的偏差,产生一个控制信号,通过执行机构驱动被控对象运行,使其运动状态接近希望状态。对生产中某些关键性参数进行自动控制,使它们在受到外界干扰(扰动)的影响而偏离正常状态时,能够被自动地调节而回到工艺所要求地数值范围内。传感器检测被控对象的状态信息(输出量),并将其转变成电信号传给控制装置。闭环控制是负反馈控制。系统组成包括:传感器、控制装置、执行机构。自动控制系统分为:开环、闭环。

2023-11-15 18:01:23 234

原创 电机应用-编码器

绝对式编码器还分为单圈绝对式编码器和多圈绝对式编码器,上图的两个例子都是针对单圈(360°内),当码盘转动超过360°,输出的编码就会重复,这样不符合绝对式编码器数据唯一的要求,所以就出现了多圈绝对式编码器。对于绝对式编码器,由于是直接输出几十位的二进制数,为了确保传输速率和信号质量,一般采用串行输出或总线型输出,例如同步串行接口(SSI)、RS485、CANopen或EtherCAT等,也有一部分是并行输出,输出电路形式与增量式编码器相同。绝对式编码器和增量式编码器的区别在于内部的码盘。

2023-11-14 11:56:58 119

原创 电机应用-无刷直流电机

与有刷电机相比,无刷直流电机将转子和定子交换(即使用电枢绕组作为定子,使用钕铁硼的永磁材料作为转子),以霍尔传感器取代碳刷换向器,性能上比一般的直流电机有很大优势。无刷直流电机(Brushless Dirent Current Motor,简称BLDCM)由电动机主体和驱动器组成,无电刷和无换向器,是除了有刷电机外用得最多的一种电机。有刷直流电机是根据额定工作电压来标注额定转速的,无刷电机引入了KV值让用户可以直观的知道无刷电机在具体的工作电压下的具体转速。无刷直流电机的转速和电压成正比。

2023-11-10 17:55:46 703

原创 电机应用-步进电机基础驱动

驱动器的作用是将控制器信号放大或者转换。控制流程:控制器输出脉冲信号给步进驱动器,步进驱动器输出控制电流的大小控制步进电机。控制定子绕组周期性、交替得电,进而控制步进电机一步一步的向前运动的这个控制器就是步进电机驱动器。有细分功能的步进驱动器可以改变步进电机的固有步距角,达到最大的控制精度、降低振动及提高输出转矩。正点原子步进电机驱动器:ATK-2MD5050。

2023-11-09 12:04:34 842

原创 电机应用-舵机

舵机(Servo,奴隶)实际上可以看做一个伺服电机,服从控制信号的要求而动作,可以很好的掌握电机角度。特点:体积小、力矩大、结构简单、稳定性高。应用:机器人关节、船舵、机械手等。舵机按控制电路分类:数字舵机、模拟舵机。数字舵机数字电路(MCU和晶振)。只需要发送一次PWM信号就能保持在规定的某个位置。模拟舵机模拟电路。需要给它不断地发送PWM信号,才能让它保持在规定的某个位置或按照某个速度转动。舵机按旋转角度分类:180°、360°。180°:±90°,舵机常用。360°:和直流电机差不多。

2023-11-08 16:58:47 231

原创 电机应用-直流有刷电机

L298N是ST公司的产品,内部包含4通道逻辑驱动电路,是一种二相和四相电机的专门驱动芯片,即内含两个H桥的高电压大电流双桥式驱动器,接收标准的TTL逻辑电平信号,可驱动4.5V~46V、2A以下的电机,电流峰值输出可达3A。所以选电机时,除了考虑转速还要考虑堵转。线框有电流时,线框就会收到磁场的作用力,按照左手定则,红色线框受到力F1,蓝色线框受到力F2,F1和F2力的方向相反,使得线框会转动。PWM通过一定的频率来改变通电和断电的时间,从而控制电路输出功率,在电机的控制周期中,通电时间决定了它的转速。

2023-11-06 18:04:33 1269

原创 STM32-高级定时器

以STM32F407为例。

2023-11-03 17:47:31 701

原创 电机应用-电机与驱动器简介

无刷电机也是使用H桥电路进行驱动的,只不过是电机的每一相都用一个半桥电路驱动,一个三相无刷电机总共需要三个半桥,而不像直流有刷电机驱动使用全桥电路。本质上是使用H桥电路进行驱动,核心电路H桥加上一些必要的外围电路,共同组成直流有刷电机的驱动器。结构复杂,电刷和换向器之间有摩擦,导致换相时产生电火花易产生电磁干扰,故障多,维护工作量大,噪音大,寿命短。混合式步进电机一般都是正方形。控制器将步进脉冲和方向信号发送到步进电机驱动器,驱动器将控制器发来的步进脉冲信号转换为激励步进电动机旋转所需的功率信号。

2023-11-03 12:01:52 397

原创 STM32-RTC实时时钟

在配置RTC模块的时钟时,通常把输入的32768Hz的RTCCLK进行32768分频得到实际驱动计数器的时钟TR_CLK = RTCCLK / 32768 =1Hz,计数周期为1s,计数器在TR_CLK的驱动下计数,即每秒计数器RTC_CNT的值+1。设置后备寄存器为可写访问后,在第一次通过APB1接口访问RTC时,因为时钟频率的差异,所以必须等待APB1和RTC外设同步,确保被读取出来的RTC寄存器值是正确的。它的计数器RTC_CNT的32位由RTC_CNTL和RTC_CNTH这两个寄存器组成。

2023-10-31 17:59:05 698

原创 STM32-电源管理(实现低功耗)

进入停止模式后,STM32的所有I/O都保持在停止前的状态,而当它被唤醒时,STM32使用HSI作为系统时钟(8MHz)运行,由于系统是在会影响很多外设的工作状态,所以一般我们在唤醒后会重新开始HSE,把系统时钟设置成原来的状态。直接调用WFI和WFE指令可以进入睡眠模式,而进入停止模式这还需要在调用指令前设置一些寄存器位,STM32 HAL库把这部分的操作封装到HAL_PWR_EnterSTOPMode()。来调用(因为__wfi和__wfe是编译器内置的函数,函数内部调用了相对应的汇编指令)。

2023-10-31 14:59:18 1241

原创 STM32-DAC

在常见的数字信号系统中,大部分传感器信号被转化成电压信号,而ADC把电压模拟信号转换成易于计算机存储、处理的数字编码,由计算机处理完成后再由DAC输出电压模拟信号,该电压模拟信号常常用来驱动某些执行器件,使人类易于感知。STM32具有片上外设DAC,它的分辨率可配置为8/12位的数字输入信号,具有两个DAC输出通道(两通道互不影响,每通道都可以使用DMA功能,都具有出错检测能力,可外部触发)。一般Vssa接地,把Vref+和Vdda接3.3V,可得到DAC的输出电压范围为:0~3.3V。

2023-10-30 18:01:59 485

原创 STM32-通用定时器

更新:计数器溢出/下溢,计数器初始化(由软件或内部/外部触发)触发事件(计数器启动、停止、初始化或由内部/外部触发计数)通用定时器由一个可编程预分频器驱动的16位自动重新加载计数器组成。脉冲长度和波形周期可以从几微秒调制到几毫秒,使用定时器预分频器和。PWM产生(边沿对齐模式和中心对齐模式)支持增量(正交)编码器和霍尔传感器电路的定位目的。同步电路控制定时器和外部信号,并互连多个定时器。16位向上、向下、向上/向下自动重装载计数器。测量输入的脉冲长度信号(输入捕获)触发输入外部时钟或逐周期电流管理。

2023-10-25 17:25:50 639

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除