一、ADC模块驱动编程
1. ADC+TIM+DMA采集交流信号
1.1采样率调整
采样率的定义:每秒内ADC进行转换(采样)的次数
ADC由定时器触发时,采样率即定时器的溢出频率;计算公式如下:
f
采样
=
H
C
L
K
(
P
S
C
+
1
)
∗
(
A
R
R
+
1
)
f_{采样}=\frac{HCLK}{(PSC+1)*(ARR+1)}
f采样=(PSC+1)∗(ARR+1)HCLK
对于STM32F401CCU6的TIM2和TIM3,HCLK均为84,000,000
在程序中通过更改PSC和ARR的值即可实现实时调整采样率。
1.1.1如何检验采样率是否正确
一个被采信号周期内采集到波形的点数*波形频率=采样率
例如,当设置ADC的采样率为128Khz,采集一个频率为2Khz的正弦信号时,采集的点数为128个点,用所得到的数字量绘制出的波形如下
可以看见采集到的128个数字量恰好绘制出该正弦信号的两个周期,故一个被采信号周期内采集到的点数为64点,故采样率为64*2KHz=128Khz。
1.2数字量与模拟量的换算
当转换精度为N位时,模拟量与数字量的关系如下
模拟量
=
3.30
V
2
N
∗
数字量
模拟量=\frac{3.30V}{2^{N}}*数字量
模拟量=2N3.30V∗数字量
基于此关系我们可以使用ADC来测量外部电压的最大最小值
1.3CubeMX配置
1.3.1 通道选择
1.3.2 触发选择
1.3.3 DMA配置
1.3.4 定时器配置
1.4 相关函数
(1) HAL_TIM_Base_Start()
(2) HAL_ADC_Start_DMA()
1.5注意事项
(1)输入电压范围:0-3.3V
(2)采样率要求:
f
采样
≥
2
∗
f
被测信号
f_{采样}\geq2*f_{被测信号}
f采样≥2∗f被测信号
二、OLED显示模块驱动
1.配置方法
1.1 显示文本
1.1.1 u8g2_SetFont()
u8g2_SetFont用于设置u8g2的字体
函数原型:void u8g2_SetFont(u8g2_t *u8g2, const uint8_t *font)
其中第一个参数为u8g2显示结构体,第二个参数为对应的字体指针;
具体示例如下:
u8g2_SetFont(&screen,u8g2_font_7x13B_mf);
这里给大家提供了几个常用字体,大家可以根据实际情况使用:
u8g2_font_7x13B_mf
u8g2_font_6x12_mf
u8g2_font_6x10_mf
u8g2_font_5x8_mf
u8g2_font_04b_03b_tr
具体显示效果如下(从上到下依次对应上述字体)
1.1.2 sprintf()
将格式化的数据写入字符串缓冲区
函数原型 int sprintf(char *str, const char *format, …)
str:指向存储结果的字符串缓冲区的指针。
format:格式字符串,可能包含类似 printf() 中的转换说明符(如 %d、%f、%s 等)。
…:与格式字符串中的转换说明符相对应的额外参数。
sprintf() 返回写入字符串的字符数(不包括字符串末尾的 null 终止符),或者在发生错误时返回负值。
1.1.3 u8g2_DrawUTF8()
函数原型 void u8g2_DrawUTF8(u8g2_t *u8g2, uint16_t x, uint16_t y, const char *s);
用于在指定的坐标 (x, y) 处绘制一个 UTF-8 编码的字符串
u8g2:u8g2显示结构体。
x 和 y:是要绘制文本的起始坐标。
s:是一个指向包含 UTF-8 编码的字符串的指针。
1.1.4 u8g2显示变量
在main函数中写入如下代码
实现了对time变量参数的显示。对于其他变量(ADC的转换值,PWM的频率、占空比等)参数的显示大家可以仿照上述代码编写
1.2 显示图片
u8g2_DrawBitmap()
函数原型 u8g2_DrawXBM(&u8g2, x, y, width, height, bitmap);
其中:
&u8g2 是指向 U8g2 显示结构体的指针。
x 和 y 是图像左上角的坐标。
width 和 height 是图像的宽度和高度。
bitmap 是包含 XBM 位图数据的数组
其中bitmap数组由取模软件生成
这里要用到两个软件 Image2Lcd和PCtoLCD2002
生成方式如下:
在主函数中定义一个数组存放上文转换出来的数据
while(1)中写如下代码
显示效果如下,要显示其他图片大家仿照上述操作即可