stm32-base-02-DAC与ADC

本系列须知:

  1. 本博客中stm32入门系列是一些基础外设的使用,所用为正点原子stm32f103zet6精英版
  2. 使用的是hal库和cubemx

本实验内容如下

  • 学会使用串口

  • 通过ADC来读取电压,通过串口发送

  • 通过DAC改变输出电压,用万用表测量

使用串口

【串口通信-HAL库】初学阻塞式收发_哔哩哔哩_bilibili

该视频中【串口通信—HAL库】初学阻塞式收发即使用串口教学,非常简单清晰

ps.一定要注意串口发送的为uint8类型的数据,如果要发uint32的,需要进行转换。

需要进阶的话,即用printf输出串口信息的话,则看它下面一则视频,记得打开魔术棒,选择Target,勾上Use MicroLIB,具体如下stm32中printf函数无法向串口输出问题解决_stm32 解决printf中%f不能输出的问题 分解-CSDN博客

ADC

【ADC-HAL库】轮询方式读取电压值_哔哩哔哩_bilibili

STM32对HAL库的ADC(单通道非DMA) - 无乐不作丶 - 博客园该博客讲了一下小细节

ps.记得先配置引脚,adc是读取引脚的电压值!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
 while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,50);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
{
value = HAL_ADC_GetValue(&hadc1);
printf("adc = %fV\r\n",value*3.3/4096);
}
}

DMA读取ADC

【ADC-HAL库】DMA方式多通道采集_哔哩哔哩_bilibili

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
HAL_Delay(500);
for(uint8_t i = 0 ;i<100;)
{
adc4 = ADC1_value[i++];
adc5 = ADC1_value[i++];
}
adc4 = adc4 / 50;
adc5 = adc5 / 50;
printf("adc4 = %fV\r\n",adc4*3.3/4096);
printf("adc5 = %fV\r\n",adc5*3.3/4096);

}

DAC

【DAC-HAL库】数模转换_哔哩哔哩_bilibili

STM32单片机开发入门(三) 万用表的介绍及使用方法_stm32万用表-CSDN博客

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
int main(void)
{
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration--------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_DAC_Init();
/* USER CODE BEGIN 2 */
/* USER CODE BEGIN 1 */

/* USER CODE END 1 */
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
set_dac(2);
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}

void set_dac(float v)
{
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,v/3.3*4096);
}

stm32-base-02-DAC与ADC
http://three27seven.top/2024/10/31/stm32-base-02-DAC与ADC/
作者
three27seven
发布于
2024年10月31日
许可协议