- 博客(24)
- 收藏
- 关注
原创 TC264芯片-摄像头循迹处理之八邻域法,逐行遍历判别法提取赛道边界
当你看完这个代码其实就明白了,其实它找边界的方法就是每一行遍历,然后判别是不是边界的方法也很简单,就是看当前这一行,比如左边界就是看当前点是黑色并且左边点是黑色,然后右边的两个点是白色。其中判别是否是赛道边界的起点的条件是,拿左起点举例,如果有一个点的左边是黑色,自己本身是黑色,它的右边两个点都是白色。然后再根据这个边界点进行边界的爬取。结语:提取赛道边界的方法有很多,我这边只介绍了最经典的八邻域法,和我自己写的遍历判别法,当然方法之间各有好坏,各位根据实际情况自己选择。这个方法的好处就是非常的简单易懂。
2024-01-13 15:06:15
1777
4
原创 STM32F407的USART功能底层解释
步骤流程:创建GPIO,UART,NVIC结构体打开所要使用的UARTx对应的时钟与对应的GPIO的时钟;只是数据的表现形式可能不是一个简单的数字,而是一个由帧头,中间数据字节,帧尾,校验位这些数据构成的数据包。其中包括帧头的识别,然后对数据包的一个数据解析,将存储在数据缓存区的数据转存到你想要的结构体数组里面去,将一团数据包拆分成有意义的数据。同样的当你需要发送数据时你只需要senddata就可以了,数据的解包由接收方来做。这个函数的作用就是根据对应的模块手册里面规定的数据格式而写的一个接收函数。
2024-01-03 22:01:29
674
原创 STM32F407的PWM基本介绍与注意事项
其中第一个参数是GPIO类型,第二个参数是该GPIO的第几个引脚,第三个参数就是你想要将这个引脚复用为它对应的哪个功能,比如上面那个函数就是对PA8引脚复用为TIM1。前言:最近在用STM32F407单片机,结果到了PWM输出的时候,死活不能正常输出,例程可以正常用,但是我修改例程,改成其他定时器的其他通道就不行了,这让我百思不得其解。因为单片机每一个引脚都用不同的硬件功能,如TIM定时器,UART,ADC等等,具体哪个引脚有什么功能要参考芯片的原理图,这边给大家放上。这个函数就是用来进行引脚复用的,
2023-12-21 13:08:04
582
原创 智能车竞赛摄像头组之大津法计算阈值
我们知道,当我们在进行赛道循迹时,需要把摄像头得到的灰度图像进行二值化处理。这个二值化处理当中要用到阈值来进行黑白分割。但是如果只是固定的一个阈值没办法适应不同环境光线的变化,所以我们要用到大津法来计算一个随环境变化的阈值。
2023-11-28 13:23:43
779
原创 单片机外设之按键的多功能实现
我们知道按键其实就是通过单片机引脚进行一个上拉输入来读取按键引脚的电平,没按下就是高电平,按下就读取到低电平,由此来判断按键按下,并执行程序。那么我们要怎么实现短按,长按,和双击的区分呢?先说长按:长按与短按的区别就在于按下的时间不同对吧,所以要想实现长按就要用到单片机内部定时器中断了,在定时器中断里写一个时间变量t,随着时间自增。然后让这个自增时间变量t在我们按键按下时(即读取到低电平时)开始从0自增。
2023-11-15 00:39:42
1391
原创 关于TC264单片机与智能车摄像头循迹的一些学习心得
通过将得到的赛道中线的水平位置与屏幕显示的中间位置(就是数组的宽的一半)进行比较,算出小车与赛道中心的误差值,将这个误差值输入到舵机的PID中进行计算,最后输出PWM给舵机进行转向。其中关于PID的部分在之前我已经上传过了,这篇文章主要讲怎么实现循迹与舵机的位置式PID调参和电机的增量式调参的一些心得。首先我们要明白英飞凌公司旗下的小钻风摄像头为灰度摄像头,它收集到的图像信号为黑白灰像素点构成的图像,那我们想要小车能识别到赛道边缘从而实现循迹,就需要对采集到的图像进行二值化处理。接着再调Kp,最后调Kp。
2023-11-07 00:30:38
4126
5
原创 STC32的概述学习(在有STM32学习的基础上)
在学习过STM32后,现在为了打智能车,开始学习STC32。STC32相比于STM32在库函数方面会更加简洁明了,其基本内核都差不多,只是在一些引脚表述上有少许差别,下面我将列举STC32的一些例程来对熟悉这个芯片。
2023-10-16 21:10:37
3763
2
原创 PID算法的应用思路(并级PID)
这个时候再加入Kd,使得小车震荡的幅度慢慢变小,当调到差不多平衡的时候就达到一个中等值,但是Kd同样也要调到中等偏大的状态,所以再继续加大一点Kd。具体方法是,先注释掉直立环,单独调整速度环,尝试Kp与Ki的正负,调到当轮子转动时,速度会一直加大,直到最大状态。但是小车的转向靠的是左右轮子的差速旋转来实现的,所以此时的PWM输出就不是简单的加到直立环和速度环后面。1、先调直立环的Kp与Kd的极性,先给它随便赋个值,目的是观察当小车往一个方向倾斜的时候,轮子会不会也向这个方向转(利用的就是小车的惯性)
2023-10-14 21:15:02
1625
2
原创 PID算法简介
PID算法是一种闭环的,也就是输入会受到输出影响的一种控制算法。PID算法可以使得外部由电机舵机等PWM控制的外设达到一种速度或姿态稳定,用于消除由于惯性作用产生的误差。简单来说PID算法就是一种反馈算法,由外部数据来实时调节自身PWM输出,来让单片机操控的外设稳定运作。
2023-10-08 20:44:47
271
1
原创 STM32代码篇之UART通信
前言:UART通信外设主要靠TX与RX引脚,切记在连接电路时TX与RX要交叉连接。GND要与单片机共地。tips:crtl+alt+space可以联想代码,在配置参数的时候很好用。UART控制流程如上图图片来自江协科技。以上代码来自江协科技,注释部分由本人写的。头文件Serial.h。Serial.c文件。
2023-09-30 15:36:00
461
3
原创 STM32代码篇之中断设置
(1)介绍:外部中断一般用于单片机外设传回特定信号使得单片机在识别到这一信号后进入中断,使得程序跳到中断函数或程序中执行。执行完中断代码后才会继续回到原来进入中断的地方。前言:在STM32的工程代码的书写中,中断绝对是一个极其常见且重要的部分,下面我将介绍STM32单片机的外部中断代码与内部定时器中断。(2)代码部分(这里用对射式红外传感器作为例子,代码来自江协科技(江科大))
2023-09-27 21:27:15
385
1
原创 STM32之SPI通信协议
SPI有四根通信线,其中SCK为时钟线,MOSI为主机发送数据的线,MISO为主机接收从机信号的线,还有SS线为片选信号线,用于选择和哪个从机通信。SPI为全双工模式,可支持同时进行主机发送和接收,但是同一时间只能与一个从机通信,不可同时与两个从机进行通信。但是SPI如果要挂载多个从机,就必须要多根数据线SS进行片选操作,所以硬件开销较大,但配置较I2C简单。且当时钟线为高电平时传输一个位的数据,同I2C一样为一位一位传输。引脚工作在输入模式,硬件模式下,在整个数据帧传输期间应把。在输出模式,则只需设置。
2023-09-26 12:38:14
201
原创 STM32之I2C通信协议
关于数据的收发,是由SDA与SCL两条线的电位变化来决定,这就有关IIC时序的基本单元。当从机接收数据时,只有当SCL为低电平时数据才能传输,所以所有从机包括主机在接收数据时,都是SCL低电平起始,SCL低电平结束。IIC通信为半双工的通信方式,只有一根数据线SDA(SDA通信引脚)和一根时钟线SCL(SCL通信引脚)。属于一主多从的总线结构,总线上的每个设备都有特定的地址(互不相同),通信都由主设备发起,从设备响应,拥有应答机制。SCL通信引脚用于时钟控制,与时钟控制寄存器(CCR)连接,用于控制时钟。
2023-09-22 23:48:34
315
1
原创 STM32代码篇之GPIO口的配置
当然以上代码只是main.c中的代码,要想让程序跑起来,就必须要将一整个工程烧录进单片机。我会在我主页的资源里为大家给出stm32工程模板。GPIO端口的配置时单片机在使用的过程中非常基础且重要的部分。下面我将以一个最基础的工程模板带大家了解GPIO的配置过程。
2023-09-21 16:47:29
259
原创 STM32单片机USART串口通信
通信是学习单片机必不可少的的一个环节,通信的方式有很多,本小结先介绍最基本的一种通信方式,以便于了解单片机的通信的模式。:单片机之间是通过高低电平的变化来传递数据的,这个高低电平的值是需要一个标准统一的。
2023-09-20 20:43:03
259
1
原创 STM32之DMA控制器
DMA有12个独立的可配置的通道,其中DMA1有7个,DMA2有5个。硬件触发一般用于外设与内部寄存器之间的数据传输,因为外设采集数据有时效性,必须等待采集完成一次之后再转运,如此反复。该图左上角为控制器相当于CPU,右边的Flash,SRAM,还有一堆的寄存器都是数据转运的对象。前言:DMA简单来说就是一个数据转运器,用于将外设与存储器之间的和存储器与存储器之间的数据进行高速转运。其中的指定重装寄存器用于实现循环模式,当传输计数器的传输数减到0时,自动重装器就会重新将计数次数初始化,达到一个循环的效果。
2023-09-19 20:04:16
319
原创 STM32的ADC模数转换器
这样,就间接的知道了外部模拟信号的电压大小,也就是数字信号。前言:ADC模数转换器,作用在于使得本来只能读取高电平或低电平的IO口可以读取高低电平之间的任意信号了,并将这一输入的模拟信号转化为数字信号呈现出来,相当于把一个看不见摸不着的变化的信号(举个例子:正弦信号)给实时用对应的电压值表示出来(现象就是可以在OLED屏幕上面实时显示当前端口的电压值)。注入通道数据寄存器:采用注入输入,即可以同时进行4个通道的ADC转换,并将其存入注入通道数据寄存器中,该寄存器的有四个位置,刚好可以储存这四个通道的数据。
2023-09-15 20:29:39
156
原创 定时器编码器接口
编码器接口可接收增量编码器信号,根据正交编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的伪装,旋转方向和速度。每个高级定时器和通用定时器都拥有一个编码器接口,编码器接口的两个输入引脚借用了输入捕获的通道一和通道二。前言:在我们需要用单片机来测量外部编码器接口或者外部的霍尔电机的旋转速度与方向时,如果使用中断来使得每转过一定角度就进中断来告诉单片机转过角度的时间,这样未免太过麻烦,占用了单片机很多的算力。当TI1上升沿时,TI2是低电平,查表得知当前编码器为向上计数模式,为正转。
2023-09-12 20:18:41
119
2
原创 STM32输入捕获
前言:单片机的输入捕获模式作用主要为分析外部输入的信号的频率与占空比(有点类似于示波器)英文简称IC(Input Cpture)。减少误差的方法,中界频率法:令f=N(上升沿计次)/T(一个周期)与f=fc(标准频率)/N中的N相等,解出f的值fm。当待测信号频率大于fm时,测频法误差小。捕获周期的方法就是测量两个上升沿之间的时间间隔(PS:每记一次CNT就要把CNT清零),就是一个周期,接着取倒数就是频率。测周法:f=fc(标准频率)/N,周期的倒数:T=N/fc,计一个数的时间是1/fc,计N个数。
2023-09-12 00:48:13
221
原创 STM32输出比较
用于比较CNT(计数器)与CCR寄存器的值,当两者进行比较大小时,进行置1,置0或翻转的操作,用于输出一定频率与占空比的波形。当频率变化够快时,就可以输出不是阶跃信号的模拟信号,例如正弦信号等。驱动电机等,注意如果使用外部电源驱动电机的话外部电源要与单片机共地,对应的PWM引脚接在单片机的输出引脚上。模式:PWM模式1:向上计数CNT<CCR时置高电平,CNT>=CCR时置低电平(还有一个向下计数一般不使用)高级定时器前三个输出比较通道拥有死区生成和互补比较的功能,用于驱动三相无刷电机。
2023-09-09 16:06:08
297
1
原创 TIM定时中断
影子寄存器/缓冲寄存器:主要是防止在一个计数周期未结束而改变预分频值导致的频率不一致的问题,缓存寄存器的存在会使得当目前的计数周期结束后进入下一个周期才会改变预分频值,在这之前该变化储存在缓冲寄存器中。例如:要设置一秒产生一个中断,则1s=1hz所以预分频值可以取71,重装载值可以取10^6-1。来自单片机TIMx-ETR引脚上的外部时钟,一般在PA0引脚,具体看对应单片机的引脚定义。时间=72MHz/(预分频值+1)/(重装载值+1) PS:1MHz=10^6Hz。
2023-09-09 12:37:25
180
1
原创 在使用keil5烧录程序是遇到的一些问题的解决方案
点开STM32 ST-LINK Utility,点击ST-LINK,点击Firmware Update,点Device connect-Yes。然后再点击Debug,发现Use里面不是STlink了,把它改成STlink Debug,之后会自动跳转固件升级,点击OK即可。在Options里device中选择随便一个芯片然后再选回现在所使用的芯片型号(PS:顺便检查是否原本芯片型号就错误了)。
2023-09-04 21:25:08
6342
1
原创 STM32中断系统之外部中断
预分频器,重装载值的介绍:stm32内部主频是72MHz,预分频器PSC相当于预先将72MHz进行分割,分割成n份,实际分频系数=PSC+1。简单说就是单片机在处理某件事的过程中出现了特定的中断条件,导致单片机停止当前程序,而去处理中断程序,处理好后再回到当前程序。中断有优先级之分,也可以有中断嵌套的情况,这是为了处理紧急情况而进入新的中断优先去处理紧急的程序,后面再细讲。抢占优先级:在当前程序还在处理的过程中进入中断,打断当前程序,优先处理中断程序,中断嵌套的由来。五、TIM定时器中断。
2023-09-03 22:10:00
446
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人