【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 属性配置
主要配置波特率,其余默认
.tekewdujwcav{}
中断配置
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,就不会出现文件类型引用错误。
【stm32单片机】[Hal库][嵌入式][1]嵌入式工程模板与“任务调度器”
一、任务调度器
1. 调度器结构体
函数指针和指针函数:C语言基础知识:函数指针&指针函数(定义格式、作用及用法说明)_指针函数的定义-CSDN博客
PS: 函数指针本身上还是一个指针,和一般指针没有区别,指向函数的执行地址
1234567//调度器类型的结构体类型声明//任务结构typedef struct { void (*task_func)(void);//函数指针 uint32_t rate_ms;//任务运行周期 uint32_t last_run;//上次运行时间} scheduler_task_t;
typedef struct {} scheduler_task_t;是⼀种定义新结构体类型的⽅式,这⾥定义 了⼀个名为 scheduler_task_t 的结构体类型。这个结构体类型包含三个成员。
void *task_func(void);定义了一个函数指针,用于储存任务函数的地址,便于进行任务调度
rate_ms表示任务具体的执行周期
last_run⽤于存储任务上次运⾏的时间戳(以毫秒为单位)。该成员⽤于 记录任务上⼀次被 ...
【Tensorflow】[2] 神经网络搭建
一、独热编码
独热编码使用N位代表N种状态,任意时候只有其中一位有效。采用独热编码的例程:
独热编码使用N位代表N种状态,任意时候只有其中一位有效。
采用独热编码的例子
12345性别: [0, 1]代表女,[1, 0]代表男数字0-9: [0,0,0,0,0,0,0,0,0,1]代表9,[0,1,0,0,0,0,0,0,0,0]代表1
独热编码的优点在于
能够处理非连续型数值特征
在一定程度上也扩充了特征。比如性别本身是一个特征,经过编码以后,就变成了男或女两个特征。
适合分类
在神经网络中,独热编码其实具有很强的容错性,比如神经网络的输出结果是 [0,0.1,0.2,0.7,0,0,0,0,0, 0]转成独热编码后,表示数字3。即值最大的地方变为1,其余均为0。[0,0.1,0.4,0.5,0,0,0,0,0, 0]也能表示数字3。
numpu中有一个函数,numpy.argmax()可以取得最大值的下标。
二、神经网络训练的重要概念
1. 输入(x)输出(y)、标签(label)
输入是指传入给网络处理的向量,相当于数学函数中的变量。
输出是指网络处理后返回的结 ...