1.DAC原理
数模转换,将数字输入,电压输出。可以配置为8位于12位模式,可以与DMA控制器配合使用。左对齐,右对齐,2个输出通道,每个通道都有专门的转换器。
stm32adc的特点
2个ADC转换器,每个转换器对应一个通道。
8位或12位输出
12位模式下数据左对齐或右对齐
同步更新
可以生成三角波和噪声波
双DAC通道同时或者分别转换
每个通道都可以设置DMA功能
2.DAC框图
左下为数模参考电压,数模转换器获取DORx的数据,对应一个接口输出电压。
我们往DHRx写入值,就会经过控制等转换到DORx
引脚作用
两个DAC对应引脚输出
DAC转换过程
就是说我们只能往DAC_DHR写入数据,根据是否选择硬件触发,经过1或3(硬件)个APB1时钟周期,数据将自动转移到DAC_DORx寄存器中,之后还要在等Tsettling的时间后才能输出模拟电压。
DAC数据格式
DAC触发选择
软件触发与硬件触发
DAC输出电压
输入的数字与输出的电压关系
3.DAC寄存器
4.DAC相关HAL库函数
一个鸟样
5.DAC配置步骤
6.DAC代码步骤
dac产生电压,adc测量
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "adc.h"
#include "dac.h"
extern DAC_HandleTypeDef hdac;
int main(void)
{
u16 adcx;
float temp;
u16 dacval=0;
u8 key;
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
SDRAM_Init(); //初始化SDRAM
LCD_Init(); //初始化LCD
MY_ADC_Init(); //初始化ADC1通道5
DAC1_Init(); //初始化DAC通道1
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,0);//初始值为0
while(1)
{
key=KEY_Scan(0);
if(key==WKUP_PRES)
{
if(dacval<4000)dacval+=200;
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dacval);//设置DAC值
}else if(key==2)
{
if(dacval>200)dacval-=200;
else dacval=0;
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dacval);//设置DAC值
}
if(key==WKUP_PRES) //WKUP/KEY1按下了,或者定时时间到了
{
adcx=HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1);//读取前面设置DAC的值
temp=(float)adcx*(3.3/4096); //得到DAC电压值
printf("DAC%f\n",temp);
adcx=Get_Adc_Average(ADC_CHANNEL_5,10); //得到ADC转换值
temp=(float)adcx*(3.3/4096); //得到ADC电压值
printf("DAC%f\n",temp);
}
delay_ms(10);
}
}
dac.c
#include"dac.h"
DAC_HandleTypeDef hdac;
GPIO_InitTypeDef GPIO_Initure;
DAC_ChannelConfTypeDef sConfig;
void DAC1_Init()
{
hdac.Instance=DAC;
HAL_DAC_Init(&hdac);
sConfig.DAC_OutputBuffer =DAC_OUTPUTBUFFER_DISABLE;//输出缓冲(一般不使用)
sConfig.DAC_Trigger = DAC_TRIGGER_NONE; //触发方式,不使用
HAL_DAC_ConfigChannel(&hdac,&sConfig,DAC_CHANNEL_1);
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
}
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{
__HAL_RCC_DAC_CLK_ENABLE(); //使能DAC时钟
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟
GPIO_Initure.Pin=GPIO_PIN_4; //PA4
GPIO_Initure.Mode=GPIO_MODE_ANALOG; //模拟模式
GPIO_Initure.Pull=GPIO_NOPULL; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FAST; //高速
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA4
}
void DAC1_Set_Vol(u16 vol) //1000->1
{
double temp=vol;
temp = temp/1000;
temp = temp*4096/3.3;
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R,temp);
}