目录
一、简述
先介绍最简单的片上
ADC
,通常是
12
位,精度则为
3.3/4096 v
。
读取
ADC
的方式有很多:
1
、轮询
2
、中断
3
、
DMA
因为在实际开发中仅有轮询和
DMA
存在使用场景,所以在这里我仅介绍轮询和
DMA
的方式
二、示例操作
(one)DAC轮询方式
1、选取ADC1的IN0![](https://img-blog.csdnimg.cn/20210824200020537.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_Q1NETiBA6Z2z5bCP6ZSFZXI=,size_29,color_FFFFFF,t_70,g_se,x_16)
2、使能ADC1通道1的连续转换模式
3、此时芯片处会自动使能引脚
4、实际代码编写
使能printf函数。
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
/* USER CODE BEGIN 0 */
int fputc(int ch, FILE *f){
uint8_t temp[1] = {ch};
HAL_UART_Transmit(&huart1, temp, 1, 2);//huart1??????????
return ch;
}
/* USER CODE END 0 */
具体adc函数编写
/* USER CODE BEGIN 1 */
uint16_t AD_Value;
/* USER CODE END 1 */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start(&hadc1);//启动adc转换
HAL_ADC_PollForConversion(&hadc1, 50);//等待转换完成,第二个参数表示超时时间,单位ms
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))//
{
AD_Value = HAL_ADC_GetValue(&hadc1);//读取ADC转换数据,数据为12位
printf("ADC_Value:%.1f mv",AD_Value*3300.0/4096);//输出adc的值
}
HAL_Delay(1000);//延迟一秒(不建议在实际应用中使用)
}
/* USER CODE END 3 */
要知道,adc转换后的数据是一个12位的二进制数,我们需要把这个二进制数代表的模拟量(电压)用数字表示出来。比如这次我们测量的电压范围是0~3.3V,转换后的二进制数是x,因为12位ADC在转换时将电压的范围大小(也就是3.3)分为4096(2^12)份,所以转换后的二进制数x代表的真实电压的计算方法就是:
y=3.3* x / 4096
(TWO)DAC之DAM方式
1、cubx配置
初始化adc通道0和通道1
(1)
使能扫描转换模式
(Scan Conversion Mode),
使能连续转换模式
(Continuous
Conversion Mode)
。
(2) : ADC
规则组选择转换通道数为
2(Number Of Conversion)
。
(3) :
配置
Rank
的输入通道。
添加DMA 设置,设置为连续传输模式,数据长度为字。
三.示例代码
uint32_t ADC_Value[100];
uint8_t i;
uint32_t ad1,ad2;
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_Delay(1000);
for(i = 0,ad1 =0,ad2=0; i < 100;)
{
ad1 += ADC_Value[i++];
ad2 += ADC_Value[i++];
}
ad1 /= 50;
ad2 /= 50;
printf("\r\n********ADC-DMA-Example********\r\n");
printf("info:AD1_value=%1.3fV\r\n", ad1*3.3f/4096);
printf("info:AD2_value=%1.3fV\r\n", ad2*3.3f/4096);
}
/* USER CODE END 3 */
其余代码配置与DAC轮询方式一致