【stm32单片机】-Hal库-嵌入式-6-PWM、输入捕获
# 按键状态机与回调函数的封装思想
一、PWM配置
生成频率为1000HZ的PWM信号,占空比可调
1. CubeMX配置
选择Internal(内部时钟)
根据CubeMX的芯片引脚图,选中引脚后的相关外设提示,可以便捷的配置定时器的作用通道
定时器PWM相关配置项
这里50有误,应该改为500——>对应50%的占空比
二、输入捕获
1. CubeMX配置
Slave Mode: Reset Mode
从模式 (Slave Mode):在定时器中,“Slave Mode” 是指定时器可以被外部信号触发或由另一个定时器控制。定时器可以通过外部输入或其他定时器的输出信号来复位、启动或停止。
Reset Mode:在从模式的复位模式下,每当触发事件发生时,定时器的计数器(CNT寄存器)会被重置。这对于需要周期性重置定时器的应用很有用。
Trigger Source: TI1FP1
触发源 (Trigger Source):TI1FP1 通常表示 “Timer Input 1 Filtered Pin 1”,即定时器通道1的输入引脚(TI1)的滤 ...
【stm32单片机】[Hal库][嵌入式][5]IIC,RTC
IIC模块
一、MCP4017
MCP4017 是一款由 Microchip Technology 公司生产的数字电位器。它是一种电子元件,通常用于调整电压、增益或信号强度,类似于传统的机械电位器,但可以通过数字控制来调节。
以下是 MCP4017 的一些主要特点:
数字电位器:MCP4017 是一个单通道的 7 位数字电位器,分辨率为 128 个不同的电阻值(2^7 = 128 步)。
I²C 接口:它使用 I²C 通信协议进行控制,通过两个引脚(SCL 和 SDA)与主设备通信。I²C 是一种广泛使用的双线通信协议,适合用于低速设备。
低功耗:MCP4017 设计为低功耗设备,适合需要节能的应用场景。
电阻范围:MCP4017 提供了不同的电阻范围,常见的型号包括 5kΩ、10kΩ、50kΩ 和 100kΩ 等。用户可以通过 I²C 指令在这些范围内调节电阻值。
非易失性存储器:该器件不带非易失性存储器(EEPROM),因此每次上电后,电位器的默认设置是中间值(即 64/128 的位置)。
应用场景:MCP4017 常用于音频调节、信号处理、传感器校准等需要精确调节电阻的场合 ...
【嵌入式系统】[RDK X3][1]RDK X3派基础入门
一、常用接口和视觉处理方法
摄像头的开启
1234567891011121314151617181920212223242526#摄像头类创建class pi_Camera(): def __init__(self): # 图像初始化配置 self.Video = cv2.VideoCapture(8, cv2.CAP_V4L2) # 使能摄像头8的驱动 # 检查摄像头是否打开 ret = self.Video.isOpened() if ret: print("The video is opened.") else: print("No video.") codec = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G') self.Video.set(cv2.CAP_PROP_FOURCC, codec) self.Video.set(cv2.CAP_PROP_FP ...
【stm32单片机】[Hal库][嵌入式][4]ADC采集系统
# VsCode配置STM32编译调试环境
【保姆】vscode配置单片机编译调试烧录环境(以STM32为例)_哔哩哔哩_bilibili
一、ADC采集系统
1. ADC通道(外部电路)
2. 功能要求
3. 动态窗口
"动态"的含义:3秒的实时采集窗口随着时间自行移动,adc采集的值动态实时更新在3s的窗口数据内
二、功能实现
1. ADC解算
1234567891011121314151617181920uint32_t dma_buff[2][30];//双通道DMAfloat adc_value[2];void adc_proc() { for(uint8_t i=0;i<30;i++) { adc_value[0] += (float)dma_buff[0][i]; adc_value[1] += (float)dma_buff[1][i]; } //10进制模拟量电压 //adc_value[0] = adc_value[0] / 30 *3.3f / 4096; //adc_value[1] = adc_value[1 ...
【FPGA】[Quartus]补充[1]——工程创建和仿真设置
author: sz_jmu
一、新建工程
完成工程创建后,如果想要修改之前的EDA tools Settings,可以:
默认情况下没有仿真组件路径,需要手动添加
手动设置仿真软件的路径:Tools->Options
创建元件
新建原理图文件
4.编写和编译代码 / 解决编译报错问题_哔哩哔哩_bilibili
将原理图设置为顶层设计实体,无需重复创建工程编译
以后在同一个工程对单个程序或者原理图进行编译时,选择为顶层设计实体即可
二、Quartus 优化配置
1. 字体
2. 编译加速
【stm32单片机】[RM电控][1]开发板的使用与CAN总线控制3508电机
一、A板介绍
A板外部晶振为12MHZ,最高主频为168MHZ
二、CAN总线通信原理
1. CAN总线是什么
1.1 CAN总线简介
CAN 是 Controller Area Network 的缩写,最初是汽车行业为了减少车身上的线束,而且还能进行大量数据的高速通信,由德国电气商博世公司在1986 年开发出的面向汽车的通信协议。现在,CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。RM的电机(3508、2006、6020)的控制也采用了CAN协议进行通信。
CAN 总线由 CAN_H 和 CAN_L 一对差分线构成,各个设备一起挂载在总线上。
参考文章:【RoboMaster】从零开始控制RM电机(2)-CAN通信原理及电调通信协议_can通讯 同步触发控制电机-CSDN博客
1.2 CAN通信的特点
1) 多主控制
多个单元同时开始发送时,发送高优先级 ID 消息的单元可获得发送权。
2) 消息的发送
所有的消息由固定格式发送,标识符(Identifier 以下称为 ID)决定优先级。
3) 通信速度
同一CAN总线 ...
【C语言进阶】[2]链表
一、可变数组
编写可变数组函数库
创建数组
回收数组
获取数组中单元个数
访问数组中的某个单元
增长数组长度
定义Array结构体:
定义为指针类型的结构体,似乎可以简化某些函数的调用传递参数,节省内存空间?
123456789#ifndef ARRAY_H#define ARRAY_Htypedef struct{ int *array; int size;}*Array;#endif
但是,当我们在函数内部创建变量的时候,这个时候a指向的是已经存在的内存空间。
1234void test(){ Array a;}
所以,一般情况下,定义结构体变量不要加*,不要定义指针类型
123456789101112131415#ifndef ARRAY_H#define ARRAY_Htypedef struct{ int *array; int size;}Array;Array array_create(int init_size);void array_free(Array *a);int array_size(const Array *a);int* a ...
【C语言进阶】[1]指针和字符串函数
一、动态内存分配
1. malloc函数
malloc(memory allocation,内存分配)函数是C语言标准库中的一个函数,用于在程序运行时动态分配一块指定大小的内存区域。这块内存是在堆(heap)上分配的,与栈上的内存不同,它的生命周期由程序员控制,可以手动分配和释放。malloc 函数的声明在 stdlib.h 头文件中。
malloc 的基本用法
123#include <stdlib.h>void* malloc(size_t size);
参数:
size: 要分配的内存大小,以字节为单位。
返回值:
成功时,返回一个指向分配内存块的指针,该指针的类型为 void*(可以强制转换为任何类型的指针)。
如果分配失败(比如系统内存不足),则返回 NULL。
示例代码:
12345678910111213141516171819202122232425262728#include <stdio.h>#include <stdlib.h>int main() { int *arr; int n = 5; ...
【Git学习】[4]远程仓库
重命名远程仓库
1git remote rename origin github
#问题
一、Hexo推送源文件,安全性报错
解决方案:转到log中指向的链接,选择use for test,
可以看到,修改后,再次push,成功提交到github。
【电赛】2024年H题-自动行驶小车
注意:CCS Theia编译可能无法找到报错位置,建议每次小幅修改后就立即编译
主要问题:
如何进行调参?
如何设计一个完整的系统?
小车如何走直线?
PID速度环
陀螺仪
小车在循迹时如何保证沿中线行驶?
如何解决陀螺仪漂移的问题
滤波算法
如何避免/减少场地干扰?
如何提高速度的同时保证行驶稳定?
程序结构-底层驱动
一、基础电机控制
源文件
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182#include "motor.h"#include <iso646.h>/** * @brief 电机启动 * @param None * @retval None */void Motor_On(void){ DL_GPIO_setPins(GPI ...
【stm32单片机】[Hal库][嵌入式][3]UART、DMA、ADC
一、串口中断+超时解析
1. CubeMX配置
1.1 属性配置
主要配置波特率,其余默认
.vpyvllnqfgtk{}
中断配置
Preemption Priority:抢占优先级
Sub Priority: 子优先级
串口的DMA设置
只开接收DMA即可
DMA的模式:
Normol
Circual
2. 驱动程序编写
2.1 串口重定向
在uasrt.c中进行修改
12345int fputc(int ch, FILE * str){ HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,10); return ch;}
2.2 app_uart.c 变量定义
123uint16_t uart_rx_index = 0;uint16_t uart_tx_ticks = 0;uint8_t uart_rx_buffer[128]={0};
2.3 中断初始化
放入Core->Src->usart.c中
在初始化中使能串口中断,往buffer中每次填充一个字节,触发中断回调
1HAL_UAR ...
【嵌入式】[开发常见问题][1]
Keil问题
编译报错问题1:
*** Using Compiler ‘V5.06 update 5 (build 528)’, folder: ‘D:\keil5\ARM\ARMCC\Bin’ Build target ‘Test_v2’ FCARM - Output Name not specified, please check ‘Options for Target - Utilities’ Target not created. Build Time Elapsed: 00:00:00
原因:引入了错误的文件类型
解决方案:keil错误和解决办法(1):FCARM - Output Name not specified, please check ‘Options for Target - Utilities‘_fcarm - output name not specified, please check 'o-CSDN博客
注意:.c文件要配置为
.h文件要配置为
但是,只要导入的时候,选择All files,就不会出现文件类型引用错误。