记录HAL库+Cube MX的学习过程,不定期更新……
一、DAC(Digital to Analog Converter)
DAC的Cube MX设置很简单,选择在Analog中选择DAC,设置OUT1,会自动对应PA4。当然,如果看过原理图,知道PA4引脚可以选择为DAC_OUT1 ,也可以直接对PA4进行设置。
打开生成的工程,插入下列代码,
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R,2048); // 设置DAC的大小
HAL_DAC_Start(&hdac, DAC_CHANNEL_2);//开启DAC转换
在PA4口检测,就可以检测到电压。
二、DAC and ADC’s Introduction
DAC:
我一直不能理解DA与AD的转换到底是怎么一回事,在做过两个实验之后,开始理解这个过程:DA就是将一个数字转换成电压,这个电压值可以通过电压表读出来。比如上面的数字2048,来说说这个数字是怎么得出来的,最后通过2048这个数字(D)转化成的电压(A)又是多少,下面开始:
STM32 DAC模块是12位的数字输入,计算机都是以2进制进行运算的,也就是说12位数字就是1111 1111 1111,值为
2
13
2^{13}
213,即4095,STM32电压输出最大为3.3V,通过对DAC的设置就可以将一个小于等于4095的值与一个小于等于3.3V的电压输出,要注意输出的电压是一个模拟信号,用电压表测量只是把这个电压变成一个符合我们认知的值显示。根据这一原理就可以让引脚输出任意值的电压。
ADC:
AD转换就是将特定引脚的电压转化为一个数字,那我们要怎么得知这个数字呢?在电脑上读取的方法一般是用串口打印。比如在一个引脚输入一个电压,就可以把这个电压转化为数字,再稍微转化一下就可以化为电压值。这个电压值最大为3.3V,数字最大为4096,跟上面DAC的数字范围以及转化相同。
三、ADC(Analog to Digital Converter)
在Analog的ADC1选项中设置IN0后,Cube MX会自动自动配置对应的引脚,IN0对应的引脚是PA0,
在下面Parameter(参数)的设置中,使能Continuous Conversion Mode(连续转换模式)。
串口的设置很简单,在Connectivity的USART1选型中设置模式为Asynchronous(异步通信),Cube MX同样配置好了相关引脚,就可以直接生成代码了。
在while(1)中插入如下代码,下载程序后,打开串口助手,对PA0端口加电压就能在串口助手上打印出电压值AD_Value。
while(1){
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("[info]main.c:v=%.1fmv\r\n",AD_Value*3300.0/4096);//打印日志
}
}
要注意的是,一些变量需要对其赋值,串口打印函数printf也要添加头文件跟函数,相关的设置会在串口通信的内容中说明。