- 博客(207)
- 收藏
- 关注
原创 LCD显示实验
视频显示可以理解为多帧图片播放,每帧图片按行显示,每行图片数据由多个像素点构成。LCDIF_TRANSFER_COUNT:Icd的行分辨率和列分辨率。LCDIF_VDCTRL3:行信号开始缓冲时间、帧信号开始缓冲时间。LCDIF_VDCTRL2:HSYNC总周期、行信号的脉冲宽度。LCDIF_CTRL1:设置ARGO模式,A通道不用传输。LCDIF_VDCTRL0:设置帧同步信号属性。LCDIF_VDCTRL4:使能同步信号。分辨率:每帧图片行数*每行像素点数。LCDIF_CTRL:复位、数据宽度。
2025-03-27 18:05:53
605
原创 串口通信实验
UART1时钟源:CCM_CSCDR1寄存器。初始化UART:UART1_UCR1:使能UART1、设置自动波特率(很少使用,直接禁用)。UART1_UCR2:设置串口的发送帧格式。奇偶校验位、软件复位。数据长度。发送完成标志、数据接收标志。发送使能、接收使能。UART1_UCR3:bit2置一,官方要求设置。UART1_UFCR:时钟分频、发送与接收的fifo大小。UART1_UBIR、UART1_UBMR:波特率。收发数据:UART1_UTXD:发送一个字符。
2025-03-18 11:19:11
857
原创 时钟控制模块、主频修改实验
刚上电时,PLL1时钟未初始化,ARM内核先使用24M晶振频率,等PLL1时钟稳定输出后,再切换回PLL1时钟。资料来源于IMX6ULL用户手册的10.3 Clock Management章节的10.3.1小节的图片。资料来源于IMX6ULL用户手册的10.3 Clock Management章节的10.3.1小节的图片。pll1_main_clk位:时钟源设置为step_clk或pll1_main_clk。CCM_CCSR寄存器:选择pll1_sw_clk、step_clk时钟源。的基础上进行了修改。
2025-03-17 17:58:55
997
原创 按键输入检测与按键中断
中断上下文:cpu通过内核寄存器来运行指令并进行数据的读写处理的,它在进入中断前一个时刻的具体值,称为中断上下文。在执行位置相关码之前,可以通过位置无关码把位置相关码加载到位置相关码的指定位置,如重定位.data段。c语言:(*(void(*)(void))0x100000)();按一下就灭,再按一下就亮。复制SDK的中断头文件:CORTEXA/Include/core_ca7.h文件。共享中断:所有内核共享的中断,ID32~ID1019。执行中断处理函数(根据中断编号,回调IRO中断服务表)
2025-03-12 13:48:01
1011
原创 I.MX 6ULL SDK + c语言点亮LED
ENTRY()是设置入口地址的命令,括号内是程序的入口,ENTRY(_start)命令表明程序的入口地址位于start.s的_start标号处。devices/MCIMX6Y2/drivers/fsl_iomuxc.h(记录引脚复用及其相关操作)将start.o中的代码放在代码段的最前面,表明start.s是启动代码应当首先被执行。.表示当前位置,. =0x80000000表示链接起始地址设置为0x80000000。引入链接脚本:指定链接地址、起始代码在text段的位置以及其他段的位置。
2025-03-07 10:49:36
413
原创 汇编点亮LED
常用汇编格式:label:标号instruction:具体汇编指令comment:注释内容常用段名:.text:代码段.data:初始化的数据段.bss:未初始化的数据段.rodata:只读数据段.section:自定义段(如.section .vector)常见伪操作:.global:定义全局标号(如.global _start).align:字节对齐(如.align 2)寄存器间数据传输:mov:寄存器数据(或者是立即数)拷贝到另一个寄存器。mov r0, r1。
2025-03-06 15:19:19
1050
原创 I.MX 6ULL裸机开发准备
在IMX6ULL用户手册中,内部启动模式设备接口编号以及属性选择如下:野火imx6ull开发板中将以上启动设置通过拨盘方式集成了:在野火i.mx 6ull开发板裸机开发过程中,使用了SD卡的方式启动程序。
2025-03-06 11:01:42
562
原创 I.MX 6ULL用户手册摘选内容
i.MX 6ULL处理器采用NXP的ARM Cortex-A7内核。该处理器可连接DDR3、DDR3L、LPDDR2(单通道)DRAM存储器件。在 Cortex-M3 或者 M4 内核的的芯片中,工作模式分为特权模式和非特权模式。特权模式下 CPU 完全控制芯片。非特权模式下不能操作某些特殊的寄存器。在 i.MX 6U 处理器中,将 CPU 工作模式进一步细分,支持九种工作模式下表所示。处理器模式编码特权等级执行(Implemented)安全状态User10000PL0Always。
2025-02-20 16:53:04
988
原创 Android实训十 数据存储和访问
1)用SharedPreferences类,当点击”写入xml文件”按钮, 把“输入你想写入内容”控件中的数据写入到login.xml文件中;2)用SharedPreferences类,当点击”读取内容”按钮, 把content.xml文件中的数据都到一个控件中;4)使用Android内置的轻量级数据库SQLite存储数据,单击“写入数据库”,把数据写入到daba.db3文件中;3)用Java的I/O体系实现文件的存储,单击“写入login.txt文件”,把数据写入到login.txt文件中;
2025-01-23 17:28:07
541
原创 Android实训九 数据存储和访问
2)用SharedPreferences类,当点击”读取内容”按钮, 把login.xml文件中的数据读到到一个TextView中,并显示内容;1)用SharedPreferences类,当点击”写入xml文件”按钮, 把“输入你想写入内容”控件中的数据写入到login.xml文件中;附注:该专栏是博主上学时的实训项目,可供访客练习与参考。代码质量不是很好,但能实现,仅供参考!
2025-01-23 17:13:08
510
原创 北京大学《操作系统原理》(陈向群主讲)课堂笔记(一)
操作系统是什么?操作系统是计算机系统中的一个系统软件,是一些程序模块的集合。1、它们能以尽量有效、合理的方式组织和管理计算机的软硬件资源。2、合理地组织计算机的工作流程,控制程序的执行并向用户提供各种服务功能。3、使得用户能够灵活、方便地使用计算机,使整个计算机系统高效率运行。解读几个关键词。有效:系统效率,资源利用率CPU利用率充足与否?I/O设备是否忙碌?合理:各种软硬件资源的管理是否公平合理如果不公平、不合理,则可能会产生什么问题?方便使用:用户界面或编程接口。
2024-12-09 12:57:02
725
原创 STM32移植嵌入式开源按键框架
MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。
2024-04-15 15:59:07
1434
原创 电机应用-步进电机进阶驱动
假设该装置使用步进电机实现物体X的移动,系统要求从A点出发,到B点停止,移动的且。根据步进电机的特性,最大程度加大电机转速(提高脉冲频率),则到达B点的时间就越短,但是如果施加脉冲频率过高,超过了步进电机的最小启动频率,则会造成电机内部的反向电动势的阻尼作用,转子与定子之间的磁反应将跟随不上电信号的变化,导致堵转或者丢步,滑块连动都没动。
2024-03-11 18:06:38
1911
1
原创 电机应用-正点原子直流有刷电机例程笔记
在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
2217
原创 电机应用-直流有刷电机(PID)
PID是Proportional(比例)Integral(积分)Differential(微分)的首字母缩写,它是一种结合比例、积分和微分三个环节于一体的闭环控制算法。本质:根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用来控制输出。
2024-02-27 09:40:50
3992
原创 FreeModbus--学习函数指针
C语言的函数指针是指向函数的指针变量,可以用来存储和调用函数的地址。作为函数的参数:函数指针可以作为参数传递给其他函数,使得可以在调用函数时动态指定要执行的函数。作为数组元素:可以使用函数指针数组来存储多个函数的地址,便于根据需要选择执行某个函数。作为函数的返回值:函数指针可以作为函数的返回值,返回指向函数的地址。该协议栈中使用到函数指针,现开展一篇专门存放函数指针的文章。为了更贴合协议栈的函数指针,稍加修改例子。
2023-12-14 11:15:13
776
原创 常用的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
729
原创 FreeRTOS-钩子函数
vApplicationTickHook()函数在中断服务程序中执行,所以这个函数必须短而有效率,不能加延时,不能大量使用堆栈,也不能调用“FromISR”结尾的API函数。如果没有其它任务优先级和空闲任务相同,那空闲任务钩子函数里不能阻塞或挂起自身。栈溢出可能会把系统栈溢出检测代码的数据也给破坏掉了,而导致栈溢出检测失效,这时栈溢出钩子函数也就无法调用了。可以统计在一定周期时间内系统执行空闲任务的tick数,就可以获取到CPU空闲率(如1s内空闲任务运行了0.9s,则CPU占用率为10%)。
2023-12-06 12:07:19
2076
4
原创 FreeRTOS-软件定时器
如果定时器已经被启动,但它的回调函数还没有被执行时,再次执行xTimerStart()函数相当于执行xTimerReset()函数,重新设定它的启动时间。定时器函数一般在中断里执行,如在中断中判断定时器是否超时,如果超时就调用回调函数。定时器的回调函数是在守护任务中被调用的,守护任务不是专为某个定时器服务的,它还要处理其他定时器。使用xTimerReset()函数可以让定时器的状态从睡眠态转换为运行态,相当于使用xTimerStart()函数。启动定时器和运行回调函数的间隔为定时器的周期。
2023-12-04 17:59:28
1545
原创 FreeRTOS-任务通知
xTaskNotifyGive / xTaskNotifyGiveFromISR都是直接给其他任务发送通知,使得通知值+1,并使得通知状态变为taskNOTIFICATION_RECEIVED,表示有数据了,待处理。使用队列、信号量、事件组时,数据保存在结构体中,其他任务、ISR都可以访问结构体的数据。使用任务通知,可以实现轻量级的队列(长度为1)、邮箱(覆盖的队列)、计数型信号量、二进制信号量、事件组。设置接收任务的通知值的某一位、某些位。使用任务通知时,任务结构体只有一个任务通知值,只能保存一个数据。
2023-12-04 12:01:18
1976
原创 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
931
原创 FreeRTOS-信号量/互斥量
二进制信号量、计数型信号量的give、take操作函数是一样的。也分两个版本:给任务使用、给ISR使用。支持的动作:give给出资源,计数值+1;take获得资源,计数值-1。vSemaphoreDelete可以用来删除二进制信号量、计数型信号量。对于动态创建的信号量,不再需要它们时,可以删除它们以回收内存。当量只有0、1时,就是二进制信号量。当量没有限制时,就是计数型信号量。创建队列时有2部分内存:队列结构体、存储数据的空间。创建信号量时,只需要分配信号量结构体。只有计数值,无法容纳其他数据。
2023-11-28 15:11:14
679
原创 FreeRTOS-队列Queue
当队列中有数据时,优先级最高的任务会先进入就绪态,同优先级时等待时间最久的任务会先进入就绪态。可使用xQueuePeek()或xQueuePeekFromISR(),这些函数会从队列中复制出数据,但是不移除数据。如果队列满则无法写入新数据,可以让任务进入阻塞状态,xTicksToWait表示阻塞的最大时间(Tick Count)。如果队列空则无法读取新数据,可以让任务进入阻塞状态,xTicksToWait表示阻塞的最大时间(Tick Count)。只要知道队列的句柄,任务、ISR都可以读、写该队列。
2023-11-27 17:57:19
678
原创 FreeRTOS-任务管理
任务1中如果不调用vTaskDelay,则空闲任务没有机会执行,也就无法释放创建任务2时分配的内存。而任务1不断地创建任务,不断消耗内存,最终会内存耗尽而无法再创建新任务。测量系统的空闲时间:空闲时间能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任务占据的时间就可以算出处理器占用率。注意:如果使用vTaskDelete()删除任务,则需确保空闲任务有机会执行,否则就无法释放被删除任务的内存。任务1继续执行,执行延时函数进入阻塞状态,轮到空闲任务执行,空闲任务释放任务2的内存(TCB、栈)。
2023-11-27 16:35:21
958
原创 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
815
原创 电机应用-直流有刷电机多环控制实现
外环的输出会作为内环的输入。外环一般是最终要控制的效果,配置基本定时器TIM6产生定时中断执行PID运算。配置高级定时器TIM1输出PWM控制电机。配置通用定时器TIM3读取编码器的计数值。编写位置环、速度环、电流环控制函数。板、野火MOS搭建的驱动板。增加上位机曲线观察相关代码。配置ADC可读取电流值。编写位置式PID算法。
2023-11-24 09:44:27
2056
原创 电机应用开发-直流有刷电机电流环控制实现
在一些场景中想让电机吊起超出电机能力的重物(即超载),但电机的能力有限,电机长期超载工作会严重损坏电机。如果想合理利用电机的性能,就需要控制电流的输出,所以需要电流环的控制。配置基本定时器产生定时中断读取当前电路中驱动电机的电流值并执行PID运算。配置基本定时器产生定时中断读取当前电路中驱动电机的电流值并执行PID运算。利用直流有刷驱动板来完成对电流的采集,最终实现电流环的闭环控制。配置定时器输出PWM控制电机。配置定时器输出PWM控制电机。增加上位机曲线观察相关代码。增加上位机曲线观察相关代码。
2023-11-23 18:05:30
2030
1
原创 电机应用开发-直流有刷电机位置环控制实现
可以以开始为参考,记录正转多少圈或反转多少圈。如一圈脉冲为1920,刚开始目标值为0,输入目标值脉冲为1920后正转一圈,再输入目标值脉冲为1920*2后正转一圈,然后输入目标值脉冲为0即可反转两圈。配置基本定时器产生定时中断来执行PID运算。配置基本定时器产生定时中断来执行PID运算。配置定时器输出PWM控制电机。配置定时器读取编码器的计数值。配置定时器输出PWM控制电机。配置定时器读取编码器的计数值。增加上位机曲线观察相关代码。增加上位机曲线观察相关代码。编写位置式PID算法。编写增量式PID算法。
2023-11-23 16:43:11
2055
原创 电机应用开发-直流有刷电机速度环控制实现
可选:L298N电机驱动板、野火MOS搭建的驱动板。配置基本定时器可以产生定时中断来执行PID运算。配置定时器可以输出PWM控制电机。配置定时器可以读取编码器的计数值。增加上位机曲线观察相关代码。编写位置式PID算法。
2023-11-22 09:41:06
438
原创 电机应用开发-编码器的使用
建立在一个已知频率的高频脉冲并对其计数,计数时间由捕获到的编码器相邻两个脉冲的间隔时间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
1325
原创 电机应用开发-PID控制器参数整定
采样周期越短,控制的效果越接近于连续,对于大多数算法缩短采样周期可使控制回路性能改善,但采样周期缩短时,频繁的采样会占用较多的计算工作时间,同时也会增加计算负担,而对有些变化缓存的受控对象无需很高的采样频率即可满意地进行跟踪,过多的采样反而没有多少实际意义。采样周期的选择:要根据所设计的系统的具体情况,用试凑的方法,在试凑过程中根据各种合理的建议来预选采样周期,多次试凑,选择性能较好的一个作为最后的采样周期。比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡。
2023-11-20 18:13:49
734
原创 电机应用-控制系统、PID
控制装置比较被控对象当前状态(输出量)和希望状态(给定量)的偏差,产生一个控制信号,通过执行机构驱动被控对象运行,使其运动状态接近希望状态。对生产中某些关键性参数进行自动控制,使它们在受到外界干扰(扰动)的影响而偏离正常状态时,能够被自动地调节而回到工艺所要求地数值范围内。传感器检测被控对象的状态信息(输出量),并将其转变成电信号传给控制装置。闭环控制是负反馈控制。系统组成包括:传感器、控制装置、执行机构。自动控制系统分为:开环、闭环。
2023-11-15 18:01:23
927
原创 电机应用-编码器
绝对式编码器还分为单圈绝对式编码器和多圈绝对式编码器,上图的两个例子都是针对单圈(360°内),当码盘转动超过360°,输出的编码就会重复,这样不符合绝对式编码器数据唯一的要求,所以就出现了多圈绝对式编码器。对于绝对式编码器,由于是直接输出几十位的二进制数,为了确保传输速率和信号质量,一般采用串行输出或总线型输出,例如同步串行接口(SSI)、RS485、CANopen或EtherCAT等,也有一部分是并行输出,输出电路形式与增量式编码器相同。绝对式编码器和增量式编码器的区别在于内部的码盘。
2023-11-14 11:56:58
513
原创 电机应用-无刷直流电机
与有刷电机相比,无刷直流电机将转子和定子交换(即使用电枢绕组作为定子,使用钕铁硼的永磁材料作为转子),以霍尔传感器取代碳刷换向器,性能上比一般的直流电机有很大优势。无刷直流电机(Brushless Dirent Current Motor,简称BLDCM)由电动机主体和驱动器组成,无电刷和无换向器,是除了有刷电机外用得最多的一种电机。有刷直流电机是根据额定工作电压来标注额定转速的,无刷电机引入了KV值让用户可以直观的知道无刷电机在具体的工作电压下的具体转速。无刷直流电机的转速和电压成正比。
2023-11-10 17:55:46
3397
原创 电机应用-步进电机基础驱动
驱动器的作用是将控制器信号放大或者转换。控制流程:控制器输出脉冲信号给步进驱动器,步进驱动器输出控制电流的大小控制步进电机。控制定子绕组周期性、交替得电,进而控制步进电机一步一步的向前运动的这个控制器就是步进电机驱动器。有细分功能的步进驱动器可以改变步进电机的固有步距角,达到最大的控制精度、降低振动及提高输出转矩。正点原子步进电机驱动器:ATK-2MD5050。
2023-11-09 12:04:34
5401
原创 电机应用-舵机
舵机(Servo,奴隶)实际上可以看做一个伺服电机,服从控制信号的要求而动作,可以很好的掌握电机角度。特点:体积小、力矩大、结构简单、稳定性高。应用:机器人关节、船舵、机械手等。舵机按控制电路分类:数字舵机、模拟舵机。数字舵机数字电路(MCU和晶振)。只需要发送一次PWM信号就能保持在规定的某个位置。模拟舵机模拟电路。需要给它不断地发送PWM信号,才能让它保持在规定的某个位置或按照某个速度转动。舵机按旋转角度分类:180°、360°。180°:±90°,舵机常用。360°:和直流电机差不多。
2023-11-08 16:58:47
956
原创 电机应用-直流有刷电机
L298N是ST公司的产品,内部包含4通道逻辑驱动电路,是一种二相和四相电机的专门驱动芯片,即内含两个H桥的高电压大电流双桥式驱动器,接收标准的TTL逻辑电平信号,可驱动4.5V~46V、2A以下的电机,电流峰值输出可达3A。所以选电机时,除了考虑转速还要考虑堵转。线框有电流时,线框就会收到磁场的作用力,按照左手定则,红色线框受到力F1,蓝色线框受到力F2,F1和F2力的方向相反,使得线框会转动。PWM通过一定的频率来改变通电和断电的时间,从而控制电路输出功率,在电机的控制周期中,通电时间决定了它的转速。
2023-11-06 18:04:33
3618
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人