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();
Stm32_Clock_Init(360,25,2,8);
delay_init(180);
uart_init(115200);
LED_Init();
KEY_Init();
SDRAM_Init();
LCD_Init();
MY_ADC_Init();
DAC1_Init();
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,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);
}else if(key==2)
{
if(dacval>200)dacval-=200;
else dacval=0;
HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,dacval);
}
if(key==WKUP_PRES)
{
adcx=HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1);
temp=(float)adcx*(3.3/4096);
printf("DAC%f\n",temp);
adcx=Get_Adc_Average(ADC_CHANNEL_5,10);
temp=(float)adcx*(3.3/4096);
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();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_Initure.Pin=GPIO_PIN_4;
GPIO_Initure.Mode=GPIO_MODE_ANALOG;
GPIO_Initure.Pull=GPIO_NOPULL;
GPIO_Initure.Speed=GPIO_SPEED_FAST;
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
void DAC1_Set_Vol(u16 vol)
{
double temp=vol;
temp = temp/1000;
temp = temp*4096/3.3;
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R,temp);
}
|