历史上的今天
今天是:2025年03月28日(星期五)
2020年03月28日 | stm32---DAC
2020-03-28 来源:eefocus
DAC即数字模拟转换器,它可以将数字信 号转换为模拟信号。
它的功能与 ADC 相反。在常见的数字信号系统中,大部分传 感器信号被转化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、 处理的数字编码,由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压 模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还 原就是这样一个过程。
触发方式
前面是定时器TIM,中间是外部中断9,后面是软件触发
dac.c
#include "dac.h"
void DAC1_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitStructure;
//1*开启DAC时钟和对应引脚时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
//2*配置引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //为什么是输出却配置模拟输入?避免自身电流的消耗,主要是为了模拟模式这样推挽,上拉全部关闭渐少电流消耗
//虽然 DAC 引脚设置为输入,但是如果使能 DACx 通道后相应的管脚会自动连接在 DAC 模拟输出上
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出速度正常配置
GPIO_Init(GPIOA,&GPIO_InitStructure);
//3*DAC初始化并使能
DAC_InitStructure.DAC_Trigger = DAC_Trigger_None; //不使用,这个程序直接设置DOR值
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;//不产生波形
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; //DAC1 输出缓存关闭 BOFF1=1,通常是关闭的
DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;//屏蔽、幅值设置,这是在产生波形时用
DAC_Init(DAC_Channel_1,&DAC_InitStructure);
DAC_Cmd(DAC_Channel_1,ENABLE);
//4*设置数据对齐方式、
DAC_SetChannel1Data(DAC_Align_12b_R,0);////12 位右对齐数据格式 设置 DOR 值
}
dac.h
#ifndef _dac_H
#define _dac_H
#include "system.h"
void DAC1_Init(void);
#endif
main.c
#include "systick.h"
#include "led.h"
#include "system.h"
#include "key.h"
#include "usart.h"
#include "dac.h"
int main()
{
u8 i=0;
u8 key;
int dac_value=0;
u16 Get_DOR_Value;
float vol=0;
SysTick_Init(72); //系统时钟初始
LED_INIT();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
USART1_Init(9600);
KEY_INIT();
DAC1_Init();
while(1)
{
key = KEY_Scan(0);
if(key==KEY_UP)
{
dac_value+=400;
if(dac_value>=4000)
{dac_value = 4095;} //dac输出是12位
DAC_SetChannel1Data(DAC_Align_12b_R,dac_value);//更新DOR
}
else if(key==KEY_DOWN)
{
dac_value-=400;
if(dac_value<=0)
{dac_value=0;}
DAC_SetChannel1Data(DAC_Align_12b_R,dac_value);
}
i++;
if(i%20==0) //200ms变换一次
{
led1=!led1;
}
if(i%50==0) //500ms采集一次
{
Get_DOR_Value = DAC_GetDataOutputValue(DAC_Channel_1);//获取DAC1通道1的输出值
vol = (float)Get_DOR_Value*(3.3/4095);
printf("DAC输出电压是%.2fVrn",vol);
}
delay_ms(10);
}
}
上一篇:stm32---DMA基础
下一篇:stm32---ADC
史海拾趣
|
需求:MotoQ9h手机刷Windows Mobile 6.5 操作系统(.nb0文件),通过USB把手机模拟成网卡,获得独立IP,然后通过与PC机桥接成功后,利用platform 刷机 问题: PC机是Windows XP SP3在微软的fareast域内,但同时也加入到了Test OU network PC机 ...… 查看全部问答> |
|
相信这方面的理解困惑初学者很久了吧,给点意见!还是想高清中断控制串口通讯。。。接收中断控制串口通讯比如在串口调试软件上面发送一数据,stm32接受后产生中断,进而给该软件回复显示刚所接收到的数据!!这个过程是接收中断控制串口通讯对吧。 ...… 查看全部问答> |
|
一.实验目的 学习使用串口和USB 相互通信的方法 二.实验设备 计算机(window xp 系统) LM3S9B96 实验评估板 USB A 型公口转 Mini B 型5Pin 数据线2 条(即电脑连接MP3 等设备的数据线) 5VDC 电源 三.实验原理 本例程中评估板实际是充 ...… 查看全部问答> |
|
各位大侠 有谁用过Arduino 蓝牙串口? 本人想用 STM32F4 接蓝牙串口CP2012来传送数据。 原本已经可以用USART进行传送, 请问串口程序是否需要更改? [ 本帖最后由 lis 于 2013-2-22 02:54 编辑 ]… 查看全部问答> |
|
LCD AND TOUCH BOOSTERPACK进展(近照) 谢谢坛友们的支持,大家都很关心LCD AND TOUCH BOOSTERPACK的进度。 今天是周末,赶紧拍了照片传上来,这是我焊接出来的第一个BOOSTERPACK的照片,就是在下面这个帖子中的那个: LCD AND TOUCH BOOSTERPACK成功点亮(更新)https://bbs.eeworld.c ...… 查看全部问答> |




