精华内容
下载资源
问答
  • STM32DAC输出遇到的问题

    千次阅读 2018-12-05 11:19:02
    DATA:2018/12/05: ...提高DAC输出的驱动能力,DAC输出缓冲打卡,未测试,猜测效果会好转。 硬件:DAC输出端加电压跟随器,所有问题全部解决(加电压跟随器后还是不能输出0V)。 总结:DAC的输出能力可以使用软...

    DATA:2018/12/05:

    问题:

    1. DA输出波形示波器显示正常,使用记录仪后信号被拉低,而且会有其他AD采集口的串扰。

    解决方案:

    1. 软件:增加ADC的采样周期,串扰问题会有所减小,但不能完全解决;提高DAC输出的驱动能力,DAC输出缓冲打卡,未测试,猜测效果会好转。
    2. 硬件:DAC输出端加电压跟随器,所有问题全部解决(加电压跟随器后还是不能输出0V)。

    总结:DAC的输出能力可以使用软件更改,输出缓冲区打开后驱动能力会提高,但是不能输出20mv以下的电压,关闭后驱动能力会很低,但可以输出0V。以后单片机DA输出最好加一个电压跟随器。

    展开全文
  • 本文将考察一款新型精密16位DAC,同时针对性能可与变压器媲美的高速互补电流输出DAC输出缓冲谈一些想法。
  • 本文将考察一款新型精密16位DAC,同时针对性能可与变压器媲美的高速互补电流输出DAC输出缓冲谈一些想法。  电压开关式16位DAC提供低噪声、快速建立时间和更出色的线性度  基于突破性10位CMOSAD7520--推出已近40...
  • 在许多控制系统的核心部分,数模转换器(DAC)在系统的性能和精度方面起着关键作用.本文将考察一款新型精密16位DAC,同时针对性能可与变压器媲美的高速互补电流输出DAC输出缓冲谈一些想法. ...
  • 本文将考察一款新型精密16位DAC,同时针对性能可与变压器媲美的高速互补电流输出DAC输出缓冲谈一些想法。  电压开关式16位DAC提供低噪声、快速建立时间和更出色的线性度  基于突破性10位CMOSAD7520--推出已近40...
  • 此代码基于stm32,使用DMA的双缓冲机制和stm32片上DAC达到输出指定频率正弦波
  • AD5791是一款单通道、20位、无缓冲电压...它内置上电复位电路,确保DAC输出上电至0V并保持已知输出阻抗状态,直到对该器件执行一次有效的写操作为止。禁用特性可将输出置于已定义的负载状态。  特性  ●分辨率:
  • 德州仪器宣布推出一款单通道 16 位缓冲电压输出数模转换器 (DAC),该器件具备1 LSB 最大线性度 (INL)、低噪声 (24 nV/rtHz ) 以及快速建立时间 (5.0 uS) 等。DAC8881 具备 5mW 超低功耗,从而为工业过程控制、自动...
  • 凌力尔特公司推出一个完整的低功率、精确 16/14/12 位非缓冲电压输出数摸转换器(DAC)系列。单极性 LTC2641 和双极性 LTC2642 仅消耗120uA 电源电流,就满标度阶跃而言,仅用1us 就能稳定在 0.5LSB 以内。这些电压...
  • 上篇:DAC输出音乐https://blog.csdn.net/shaynerain/article/details/108052191 相关文章:WAV文件解析https://blog.csdn.net/shaynerain/article/details/108052144 上篇中的双缓冲输出后大部分歌曲都会有pupu...

    前言

    上篇:DAC输出音乐https://blog.csdn.net/shaynerain/article/details/108052191

    相关文章:WAV文件解析https://blog.csdn.net/shaynerain/article/details/108052144

     

    上篇中的双缓冲输出后大部分歌曲都会有pupu声,经过检查是在读取音乐时读取多了一部分其他信息。

    Main

    正常的音频文件前后都会有0x00来缓冲,如图所示,但是导出的wav文件在data数据后还有一些附加信息,所以在读取时需要注意是否有多读取不必要的信息,需要在读取时做处理。

    wav使用二进制打开

    处理

    判断结尾处是否已经超过了总的长度,如果超过,把超过部分置零,即没有声音

     

    from:https://blog.csdn.net/shaynerain

    展开全文
  • 凌力尔特公司(Linear Technology Corporation)推出一个完整的低功率、精确16/14/12位非缓冲电压输出数摸转换器(DAC)系列。单极性LTC2641和双极性LTC2642仅消耗120uA电源电流,就满标度阶跃而言,仅用1us就能稳定在...
  • Linear推出一个完整的低功率、精确16/14/12位非缓冲电压输出数摸转换器(DAC)系列。单极性LTC2641和双极性LTC2642仅消耗120uA电源电流,就满标度阶跃而言,仅用1us就能稳定在0.5LSB以内。这些电压输出DAC具有0.5nV?...
  • 凌力尔特公司(Linear Technology Corporation)推出一个完整的低功率、精确 16/14/12 位非缓冲电压输出数摸转换器(DAC)系列。单极性 LTC2641 和双极性 LTC2642 仅消耗 120uA 电源电流,就满标度阶跃而...
  • 日前,德州仪器 (TI) 宣布推出一款单通道 16 位缓冲电压输出数模转换器 (DAC),该器件具备多种优越特性,其中包括 1 LSB 最大线性度 (INL)、低噪声 (24 nV/rtHz ) 以及快速建立时间 (5.0 uS) 等。DAC8881 具备 5mW ...
  • STM32编程为何内部不应开DAC缓冲

    千次阅读 2019-05-06 08:40:32
    为工业场合开发的设备通常情况下都会具有4-20mA输出接口,在以往没有DAC模块的单片机系统,需要外加一主片DAC实现模拟量的控制,或者采用PWM来摸拟DA,但也带来温漂和长期稳定性问题。在以STM32为中心的设备中,使用...

     

          为工业场合开发的设备通常情况下都会具有4-20mA输出接口,在以往没有DAC模块的单片机系统,需要外加一主片DAC实现模拟量的控制,或者采用PWM来摸拟DA,但也带来温漂和长期稳定性问题。在以STM32为中心的设备中,使用它自带的DAC即可非常方便的实现4-20mA的输出接口,具有精度高、稳定性好、漂移小以及编程方便等特点。

     

    在STM32单片机系统中,100脚以下没有外接出VREF引脚,但这样使得DAC的参考端和VCC共用,带来较大误码差,为解决这一问题,可以使用廉价的TL431来解决供电问题,TL431典型温漂为30ppm,所以在一般应用中已非常足够。选用两只低温漂电阻,调整输出使TL431的输出电压在3V-3.6V之间,它的并联稳压电流可达到30mA,正好能满足一般STM32核心的功耗需求。

     

    利用TL431解决了供电问题,余下的就是4-20mA的转换电路,如下图:

     

     

    上图即为非常精确的转换电路,OPA333是一颗非常优异的单电源轨至轨运算放大器,其工作电压为2.7-5.5V,其失调电压仅为10uV,实测最低输出为30uV,最高输出可达VCC-30uV。电路组成压控恒流源,其关键在于OPA333这颗芯片的优异性能,使得以上电路获得了极高的精度和稳定性。DACOUT来自于STM32的DAC1或者DAC2输出,由C25进行数字噪场滤波之后进入运算,进行1:1缓冲,后经过Q2进行电流放大,在R7上形成检测电压,C17进行去抖动处理。4-20mA信号由AN_OUT+/AN_OUT-之间输出。

     

    上图中,负载中的电流在R7上形成压降,经运放反馈后得到Vdacout=Vr7=I*R7,所以:I=Vdacout/R7,当Vdacout在400mV到2000mV之间变化时,可得到4-20mA的输出。改变R7的大小,便可改变DACOUT的需求范围。电路中,R2的基射极之间将有0.7V左右的偏压,所以Vb[MAX]=2V+0.7V=2.7V,这正好在OPA333的输出范围之内。电路中R14做为输出端的限流电流,使得输出端的最大输出电流Imax=Vcc/(R7+R14),若Vcc取6V,则Imax=6V/200 O=30mA,若没有R14,则最大电流可能有60mA,这时R7上的耗散功率为0.06*0.06*100=0.36W,若选用0805贴片电阻,将导致R7烧坏,或者由于温度升高太严重导致R7阻值变化太大输出引起较大偏差。加入R14之后,R7上的最大耗散功率为:0.03*0.03*100=0.09W,此时在正常的范围之内。

     

    电路中R14不可省去,C17不可省去,由于外负载可能的微小干扰或波动将导致OPA333组成的深度负反馈电路形成振荡,使输出电流波动,加入C17能抑制这种波动,使输出更稳定,但是C17的值不宜过大。

     

    使用STM32编程应注意,其内部不应当开DAC缓冲,因以上电路已经为一个高输入阻抗的缓冲电路。由STM32内部缓冲电路将损失掉输出线性度。

    展开全文
  • DAC输出阻抗的问题: DAC集成了2个输出缓存,可以用来减少输出阻抗,无须外部运放即可直接驱动外部负载。每个DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭,如果带载能力还不行,后面就需要接一...

    硬件平台:STM32F4
    库类型:标准库。
    参考:【二代示波器教程】第12章 示波器设计—DAC信号发生器的实现

    DAC输出阻抗的问题:

    DAC集成了2个输出缓存,可以用来减少输出阻抗,无须外部运放即可直接驱动外部负载。每个DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭,如果带载能力还不行,后面就需要接一个电压跟随器,选择运放一定要选择电流大的型号。

    DAC使能输出缓冲后,DAC的最小输出电压为0.2V。最大电压为Vref±0.2(会造成削顶问题)。而未使能输出缓冲则可达到0V。
    在这里插入图片描述
    输出缓冲和外接负载时的框图。
    在这里插入图片描述

    DAC驱动实现

    我们这里使用了DAC1,驱动中还需要用到TIM6和DMA,方便我们配置不同的的频率,占空比和幅值。

    1. 引脚配置和DAC配置

    /*
    *********************************************************************************************************
    *	函 数 名: bsp_InitDAC1
    *	功能说明: 配置PA4/DAC1
    *	形    参: 无
    *	返 回 值: 无
    *********************************************************************************************************
    */
    void bsp_InitDAC1(void)
    {	
    	/* 配置GPIO */
    	{
    		GPIO_InitTypeDef GPIO_InitStructure;
    		
    		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    		
    		/* 配置DAC引脚为模拟模式  PA4 / DAC_OUT1 */
    		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    		GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
    		GPIO_Init(GPIOA, &GPIO_InitStructure);
    	}	
    
    	/* DAC通道1配置 */
    	{
    		DAC_InitTypeDef DAC_InitStructure;
    		
    		/* 使能DAC时钟 */
    		RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);		
    
    		DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;	/* 选择软件触发, 软件修改DAC数据寄存器 */
    		DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
    		DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
    		//DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
    		DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
    		DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    		DAC_Cmd(DAC_Channel_1, ENABLE);
    	}
    }
    

    特别注意。程序中关闭了DAC输出缓冲,即DAC参数成员DAC_InitStructure.DAC_OutputBuffer。

    2. DAC的定时器触发和DMA配置:

    /*
    *********************************************************************************************************
    *	函 数 名: dac1_InitForDMA
    *	功能说明: 配置PA4 为DAC_OUT1, 启用DMA2
    *	形    参: _BufAddr : DMA数据缓冲区地址
    *			  _Count   : 缓冲区样本个数
    *			 _DacFreq  : DAC样本更新频率
    *	返 回 值: 无
    *********************************************************************************************************
    */
    void dac1_InitForDMA(uint32_t _BufAddr, uint32_t _Count, uint32_t _DacFreq)
    {	
    	uint16_t usPeriod;
    	uint16_t usPrescaler;
    	uint32_t uiTIMxCLK;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	
    	DMA_Cmd(DMA1_Stream5, DISABLE);
    	DAC_DMACmd(DAC_Channel_1, DISABLE);
    	TIM_Cmd(TIM6, DISABLE);
    	
    
    	/* TIM6配置 */
    	{
    		RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
    
    		uiTIMxCLK = SystemCoreClock / 2;
    		
    		if (_DacFreq < 100)
    		{
    			usPrescaler = 10000 - 1;						 /* 分频比 = 10000 */
    			usPeriod =  (uiTIMxCLK / 10000) / _DacFreq  - 1; /* 自动重装的值 */
    		}
    		else if (_DacFreq < 3000)
    		{
    			usPrescaler = 100 - 1;							/* 分频比 = 100 */
    			usPeriod =  (uiTIMxCLK / 100) / _DacFreq  - 1;	/* 自动重装的值 */
    		}
    		else	/* 大于4K的频率,无需分频 */
    		{
    			usPrescaler = 0;						/* 分频比 = 1 */
    			usPeriod = uiTIMxCLK / _DacFreq - 1;	/* 自动重装的值 */
    		}
    
    		TIM_TimeBaseStructure.TIM_Period = usPeriod;
    		TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler;
    		TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    		TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    		TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000;		/* TIM1 和 TIM8 必须设置 */	
    
    		TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
    
    		/* 选择TIM6做DAC的触发时钟 */
    		TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
    	}
    
    	/* DAC通道1配置 */
    	{
    		DAC_InitTypeDef DAC_InitStructure;
    		
    		/* 使能DAC时钟 */
    		RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);		
    
    		DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
    		DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
    		DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
    		//DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;
    		DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
    		DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    		DAC_Cmd(DAC_Channel_1, ENABLE);
    	}
    
    	/* DMA1_Stream5配置 */
    	{
    		DMA_InitTypeDef DMA_InitStructure;
    
    		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
    
    		/* 配置DMA1 Stream 5 channel 7用于DAC1 */
    		DMA_InitStructure.DMA_Channel = DMA_Channel_7;
    		DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DAC->DHR12R1; 
    		DMA_InitStructure.DMA_Memory0BaseAddr = _BufAddr;	
    		DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;		
    		DMA_InitStructure.DMA_BufferSize = _Count;
    		DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    		DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    		DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    		DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
    		DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;								//循环模式
    		DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    		DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    		DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    		DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    		DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    		DMA_Init(DMA1_Stream5, &DMA_InitStructure);
    		DMA_Cmd(DMA1_Stream5, ENABLE);
    
    		/* 使能DAC通道1的DMA */
    		DAC_DMACmd(DAC_Channel_1, ENABLE);
    	}
    
    	/* 使能定时器 */
    	TIM_Cmd(TIM6, ENABLE);
    }
    
    

    通过这个函数可以方便的计算DAC的输出波形频率。 计算方法如下:

    输出波形频率 = 配置的定时器触发频率 / DMA的缓冲个数 。

    其中,DMA缓冲数据的个数就是输出波形一个周期的采样点数。程序中统一将其配置为128个点代表一个周期的波形。实际应用中,配置的点数不要太少, 否则波形不够漂亮。

    比如,我们需要输出 10KHz的波形,这个函数的配置就是:

    dac1_InitForDMA((uint32_t)&g_Wave1,128, 10000 * 128)
    

    数组g_Wave1里面是128个波形采样点。通过修改触发频率来实现波形频率。

    关于这个驱动代码,要注意TIM6的配置。F4的定时器从TIM1到TIM14的主频如下:

    /*
     
    ********************************************************************************
     
    system_stm32f4xx.c 文件中 voidSetSysClock(void) 函数对时钟的配置如下:
    
    HCLK = SYSCLK / 1     (AHB1Periph)
     
    PCLK2 = HCLK / 2      (APB2Periph)
     
    PCLK1 = HCLK / 4      (APB1Periph)
     
    因为APB1 prescaler != 1, 所以 APB1上的TIMxCLK = PCLK1 x 2 = SystemCoreClock/ 2;
     
    因为APB2 prescaler != 1, 所以 APB2上的TIMxCLK = PCLK2 x 2 =SystemCoreClock;
     
    APB1 定时器有 TIM2, TIM3,TIM4, TIM5, TIM6, TIM7, TIM12, TIM13, TIM14
     
    APB2 定时器有 TIM1, TIM8,TIM9, TIM10, TIM11
     
    TIM 更新周期是 = TIMCLK / (TIM_Period + 1)/(TIM_Prescaler+ 1)
    ********************************************************************************
    */
    

    由此可知,TIM6的主频是SystemCoreClock / 2。当主频是168MHz时,TIM6的时钟就是84MHz,TIM6更新周期 = TIM6CLK / (TIM_Period + 1)/(TIM_Prescaler+ 1),其中

    TIM_Period就是定时器结构体成员TIM_TimeBaseStructure.TIM_Period。

    TIM_Prescaler就是定时器结构体成员TIM_TimeBaseStructure.TIM_Prescaler。

    另外还有非常重要的一点,TIM6是16位定时器,这两个参范围是0-65535,切不要超过65535。正是因为这个原因,程序中对不同的输出频率做了范围区分。

    3. 正弦波输出配置:

    /*
    *********************************************************************************************************
    *	函 数 名: dac1_SetSinWave
    *	功能说明: DAC1输出正弦波
    *	形    参: _vpp : 幅度 0-4095;
    *			  _freq : 频率
    *	返 回 值: 无
    *********************************************************************************************************
    */
    void dac1_SetSinWave(uint16_t _vpp, uint32_t _freq)
    {	
    	uint32_t i;
    	uint32_t dac;
    	
    	TIM_Cmd(TIM6, DISABLE);
    		
    	/* 调整正弦波幅度 */		
    	for (i = 0; i < 128; i++)
    	{
    		dac = (g_SineWave128[i] * _vpp) / 4095;
    		if (dac > 4095)
    		{
    			dac = 4095;	
    		}
    		g_Wave1[i] = dac;
    	}
    	
    	dac1_InitForDMA((uint32_t)&g_Wave1, 128, _freq * 128);
    }
    

    正弦波输出128个采样点代表一个周期,同时程序里面增加了一个幅值设置功能,范围0到4095。实际DAC输出的波形频率由前面第2步函数 dac1_InitForDMA实现。比如我们要实现频率10KHz,幅值4095正弦波,那么配置就是:dac1_SetSinWave(4095, 10000)

    生成正弦波数据表

    要输出正弦波,实质是要控制 DAC 以 v=sin(t)的正弦函数关系输出电压,其中 v 为电压输出,t 为时间。 而由于模拟信号连续而数字信号是离散的,所以使用 DAC 产生正弦波时,只能按一定时间间隔输出正弦曲线上的点,在该时间段内输出相同的电压值,若缩短时间间隔,提高单个周期内的输出点数,可以得到逼近连续正弦波的图形,见下图 37-3,若在外部电路加上适当的电容滤波,可得到更完美的图形。
    在这里插入图片描述
    由于正弦曲线是周期函数,所以只需要得到单个周期内的数据后按周期重复即可,而单个周期内取样输出的点数又是有限的,所以为了得到呈 v=sin(t)函数关系电压值的数据通常不会实时计算获取,而是预先计算好函数单个周期内的电压数据表,并且转化成以 DAC 寄存器表示的值。 如 sin 函数值的范围为[-1: +1],而 STM32 的 DAC 输出电压范围为[0~3.3]V,按 12 位 DAC 分辨率表示的方法,可写入寄存器的最大值为 212 = 4096,即范围为[0:4096]。所以,实际输出时,会进行如下处理:

    1. 抬升 sin 函数的输出为正值:v = sin(t)+1 ,此时,v 的输出范围为[0:2];
    2. 扩展输出至 DAC 的全电压范围: v = 3.3*(sin(t)+1)/2 ,此时,v 的输出范围为[0:3.3], 正是 DAC 的电压输出范围,扩展至全电压范围可以充分利用 DAC 的分辨率;
    3. 把电压值以 DAC 寄存器的形式表示:Reg_val = 212/3.3 * v = 211*(sin(t)+1),此时,存储到 DAC 寄存器的值范围为[0:4096];
    4. 实践证明,在 sin(t)的单个周期内,取 32 个点进行电压输出已经能较好地还原正弦波形,所以在 t∈[0:2π]区间内等间距根据上述 Reg_val 公式运算得到 32 个寄存器值,即可得到正弦波表;
    5. 控制 DAC 输出时,每隔一段相同的时间从上述正弦波表中取出一个新数据进行输出,即可输出正弦波。改变间隔时间的单位长度,可以改变正弦波曲线的周期。

    生成的正弦波数据表:

    /*  正弦波数据,12bit,1个周期128个点, 0-4095之间变化 */
    const uint16_t g_SineWave128[] = {
    	2047 ,  2147 ,	2248 ,	2347 ,	2446 ,	2544 ,	2641 ,	2737 ,
    	2830 ,  2922 ,	3012 ,	3099 ,	3184 ,	3266 ,	3346 ,	3422 ,
    	3494 ,  3564 ,	3629 ,	3691 ,	3749 ,	3803 ,	3852 ,	3897 ,
    	3938 ,	3974 ,	4006 ,	4033 ,	4055 ,	4072 ,	4084 ,	4092 ,
    	4094 ,	4092 ,	4084 ,	4072 ,	4055 ,	4033 ,	4006 ,	3974 ,
    	3938 ,	3897 ,	3852 ,	3803 ,	3749 ,	3691 ,	3629 ,	3564 ,
    	3494 ,	3422 ,	3346 ,	3266 ,	3184 ,	3099 ,	3012 ,	2922 ,
    	2830 ,	2737 ,	2641 ,	2544 ,	2446 ,	2347 ,	2248 ,	2147 ,
    	2047 ,	1947 ,	1846 ,	1747 ,	1648 ,	1550 ,	1453 ,	1357 ,
    	1264 ,	1172 ,	1082 ,	995  ,	910  ,	828  ,	748  ,	672  ,
    	600  ,	530  ,	465  ,	403  ,	345  ,	291  ,	242  ,	197  ,
    	156  ,	120  ,	88   ,	61   ,	39   ,	22   ,	10   ,	2    ,
    	0    ,	2    ,	10   ,	22   ,	39   ,	61   ,	88   ,	120  ,
    	156  ,	197  ,	242  ,	291  ,	345  ,	403  ,  465  ,	530  ,
    	600  ,	672  ,	748  ,	828  ,	910  ,	995  ,	1082 ,	1172 ,
    	1264 ,	1357 ,	1453 ,	1550 ,	1648 ,	1747 ,	1846 ,	1947
    };
    

    4. 方波输出配置:

    /*
    *********************************************************************************************************
    *	函 数 名: dac1_SetRectWave
    *	功能说明: DAC1输出方波
    *	形    参: _low  : 低电平时DAC, 
    *			  _high : 高电平时DAC
    *			  _freq : 频率 Hz
    *			  _duty : 占空比 2% - 98%, 调节步数 1%
    *	返 回 值: 无
    *********************************************************************************************************
    */
    void dac1_SetRectWave(uint16_t _low, uint16_t _high, uint32_t _freq, uint16_t _duty)
    {	
    	uint16_t i;
    	TIM_Cmd(TIM6, DISABLE);
    	
    	for (i = 0; i < (_duty * 128) / 100; i++)
    	{
    		g_Wave1[i] = _high;
    	}
    	for (; i < 128; i++)
    	{
    		g_Wave1[i] = _low;
    	}
    	
    	dac1_InitForDMA((uint32_t)&g_Wave1, 128, _freq * 128);
    }
    

    方波也是输出128个采样点代表一个周期,同时支持幅值和占空比的配置,其中占空比可以配置2%到98%,直接填数值2到98就可以了。实际DAC输出的波形频率由前面第2步函数dac1_InitForDMA实现。比如我们要实现频率10KHz,幅值4095,占空比50%的方波,那么配置就是:dac1_SetRectWave(0, 4095, 10000, 50)。

    5. 三角波输出配置:

    /*
    *********************************************************************************************************
    *	函 数 名: dac1_SetTriWave
    *	功能说明: DAC1输出三角波
    *	形    参: _low : 低电平时DAC, 
    *			  _high : 高电平时DAC
    *			  _freq : 频率 Hz
    *			  _duty : 占空比
    *	返 回 值: 无
    *********************************************************************************************************
    */
    void dac1_SetTriWave(uint16_t _low, uint16_t _high, uint32_t _freq, uint16_t _duty)
    {	
    	uint32_t i;
    	uint16_t dac;
    	uint16_t m;
    	
    	TIM_Cmd(TIM6, DISABLE);
    		
    	/* 构造三角波数组,128个样本,从 _low 到 _high */		
    	m = (_duty * 128) / 100;
    	
    	if (m == 0)
    	{
    		m = 1;
    	}
    	
    	if (m > 127)
    	{
    		m = 127;
    	}
    	for (i = 0; i < m; i++)
    	{
    		dac = _low + ((_high - _low) * i) / m;
    		g_Wave1[i] = dac;
    	}
    	for (; i < 128; i++)
    	{
    		dac = _high - ((_high - _low) * (i - m)) / (128 - m);
    		g_Wave1[i] = dac;
    	}	
    	
    	dac1_InitForDMA((uint32_t)&g_Wave1, 128, _freq * 128);
    }
    

    三角波也是输出128个采样点代表一个周期,同时支持幅值和占空比的配置,其中占空比可以配置0%到100%,不过程序中对0%和100%做了一个特殊处理。实际DAC输出的波形频率由前面第2步函数dac1_InitForDMA实现。比如我们要实现频率10KHz,幅值4095,占空比50%的三角波,那么配置就是:dac1_SetTriWave (0, 4095, 10000, 50)

    展开全文
  • 已知在缓冲区DATA中有一批离散数据,要求用DAC0832(如图10.9所示)使离散数据输出为周期性的模拟信号,编写输出程序。 LOP1:LEA SI,DATA 设数据存放在DATA开始的内存中 MOV CX,SUM 设数据长度存放在SUM中 LOP0:MOV...
  • 根据对DAC0832的数据锁存器和DAC寄存器的不同的控制方式,DAC0832有三种工作方式:直通方式、单缓冲方式和双缓冲方式。
  • Stm32f103 DAC 学习笔记 最近在做电流型信号输出的项目,遇到了些问题这里把这些解决方法做一个笔记方便以后运用...在电池输出时AD值为0时 取样电阻100欧姆有0.66mA的电流输出,只要在初始化时只要失能端口输出缓冲...
  • 针对精密16数模转换应用,本电路使用AD5542A/AD5541A电压输出DAC、ADR421基准电压源以及用作基准电压缓冲的AD8675 超低失调运算放大器,提供了一款低风险解决方案。  基准电压缓冲对于设计至关重要,因为DAC基准...
  • 凌力尔特公司(Linear Technology Corporation)推出具10ppm/℃基准的四通道12位/10位/8位 PWM至电压输出的数模转换器(DAC) LTC2645。这些器件在不到8μs时间内将PWM输入信号转换成准确、稳定、有缓冲的12位电压输出,...
  • 一、平台(以STM32H750VBxx系列为例) 二、配置 1、确认时钟源 ...输出缓冲Output Buffer建议关闭。DAC的输出缓存可以用来减小输出阻抗,无需外部运放即可直接驱动外部负载。但输出不能达...
  • 利用电压输出DAC实现真正的16位性能不仅要求选择...针对精密16数模转换应用,本电路使用AD5542A/AD5541A电压输出DAC、ADR421基准电压源以及用作基准电压缓冲的AD8675 超低失调运算放大器,提供了一款低风险解决方案。
  • 电路描述  AD5763是一款高性能数模转换器,可保证单调性...AD5763内置基准电压源缓冲器,因而无需外部正负基准电压源及相关的缓冲器,这样便进一步节省了成本和电路板空间。因为基准输入(REFA、REFB)上施加的电压用
  • DAC7512是TI公司生产的具有内置缓冲放大器的低功耗单片12位数模转换器。其片内高精度的输出放大器可获得满幅(供电电源电压与地电压间)任意输出DAC7512带有一个时钟达30MHz的通用三线串行...
  • DAC8563 DAC模块资料

    2019-03-13 11:07:49
    DAC8563具有 2.5V、4ppm/°C 基准的16 位、双路、低功耗、超低短时脉冲波形干扰、缓冲电压输出 DAC。 包含硬件电路设计资料,芯片资料,软件驱动等。
  • 电路描述  AD5763是一款高性能数模转换器,可保证单调性,...AD5763内置基准电压源缓冲器,因而无需外部正负基准电压源及相关的缓冲器,这样便进一步节省了成本和电路板空间。因为基准输入(REFA、REFB)上施加的电
  • 凌力尔特公司(Linear Technology Corporation)推出一个完整的低功率、精确 16/14/12 位非缓冲电压输出数摸转换器(DAC)系列。单极性 LTC2641 和双极性 LTC2642 仅消耗 120uA 电源电流,就满标度阶跃而言,仅用 1...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 195
精华内容 78
关键字:

dac输出缓冲