简介
基于前面的文章, 缩略STM32CubeMx创建项目的过程,直接添加DAC相关初始化;
开发板 : Bearpi Std(小熊派标准板)
主芯片: STM32L431RCT6
LED : PC13 \ 推挽输出即可 \ 高电平点亮
串口: Usart1
KEY1 : PB2 \ 上拉 \ 按下下降沿触发(一次)\ 用于增值
KEY2 : PB3 \ 上拉 \ 按下下降沿触发(一次) \ 用于减值
DAC1: PA5
步骤
- 一如既往根据前面几篇创建工程
初始化LED GPIO口,按键Key1和Key2(输入即可, 不需要中断), 串口(同样不需要中断) - 初始化DAC1
a. DAC1 使用通道2输出
b. gpio 口 PA5 初始化模式为模拟模式
- 生成项目BearPi_DAC1代码
- 添加用户代码
int main(void)
{
/* USER CODE BEGIN 1 */
int32_t DACValue = 0;
/* USER CODE END 1 */
...
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(USER_LED_GPIO_Port, USER_LED_Pin, GPIO_PIN_SET); // 生命灯, 程序是否正常执行了
HAL_DAC_Start(&hdac1, DAC_CHANNEL_2); // 开启通道2 DA转换
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (HAL_GPIO_ReadPin(USER_KEY1_GPIO_Port, USER_KEY1_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(100); // 消抖
if (HAL_GPIO_ReadPin(USER_KEY1_GPIO_Port, USER_KEY1_Pin) == GPIO_PIN_RESET)
{
DACValue += 10;
if(DACValue > 255)
{
DACValue = 255;
}
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_8B_R, DACValue); // 设置输出值
printf(" KEY1+ DACvalue:%d,Voltage:%3.3f\r\n", DACValue, DACValue*3.3/255); // 理论值打印
}
}
if (HAL_GPIO_ReadPin(USER_KEY2_GPIO_Port, USER_KEY2_Pin) == GPIO_PIN_RESET)
{
HAL_Delay(100); // 消抖
if (HAL_GPIO_ReadPin(USER_KEY2_GPIO_Port, USER_KEY2_Pin) == GPIO_PIN_RESET)
{
DACValue -= 10;
if (DACValue < 0)
{
DACValue = 0;
}
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_2, DAC_ALIGN_8B_R, DACValue); // 设置输出值
printf(" KEY2- DACvalue:%d, Voltage:%3.3f\r\n", DACValue, DACValue*3.3/255); // 理论值打印
}
}
HAL_Delay(100);
}
/* USER CODE END 3 */
前言后说
Vout = Vref * (D / 2^n)
其中Vref代表参考电压,
n为DAC的位数,
D为DAC输入的数字信号。
例如,假设有一个12位分辨率的DAC,参考电压为5V,那么当输入的数字信号为4095(即二进制的111111111111)时,
输出电压应为:Vout = 5V * (4095 / 2^12) = 2.5V。这是因为在这个例子中,
12位DAC的分辨率是2^12,所以最大的输入数字信号是2^12-1=4095。
当输入的数字信号小于最大值时,输出电压会随着输入信号的增大而线性增大;
当输入的数字信号大于最大值时,输出电压将会保持在最大值不变。
本例使用8位DAC的分辨率, 且芯片引用电压是3.3V : 公式为 Vout = 3.3 * D / 255
完整BearPi_DAC1项目代码