精华内容
下载资源
问答
  • STM32F407VET.基于DDS 用内置DAC实现多种波形(正弦 方波 三角波 锯齿波)输出,支持频率可调 (范围1HZ-5MHZ 在5MHz下精度大约100khz左右) 有自定义波形功能
  • 直接数字频率合成器(DDS)也是一种DAC,可以生成数字正弦信号,并将其馈入DAC来产生相应的模拟信号。本文将重点介绍新近出现的一项技术突破,它借助DDS技术大幅提升了DAC的无杂散动态范围(SFDR)性能。  从理论上来...
  • pwm实现dac

    千次阅读 2020-02-09 21:03:57
    PWM是脉冲宽度调制,也就是频率固定,占空比可变,信号就是方波,只有高低电平,相当于数字信号,而DAC是模拟输出输出信号在一定程度上和一定范围内可以认为是连续可变的,但是PWM可以通过滤波器实现低精度的DAC...

    pwm与dac的区别:
    PWM是脉冲宽度调制,也就是频率固定,占空比可变,信号就是方波,只有高低电平,相当于数字信号,而DAC是模拟输出,输出信号在一定程度上和一定范围内可以认为是连续可变的,但是PWM可以通过滤波器实现低精度的DAC功能
    pwm实现dac的优点:
    STM32很多型号是没有DAC的。通常情况下,采用专用的D/A芯片来实现,但是这样就会带来成本的增加。但是STM32所有的芯片都有PWM输出,并且PWM输出通道很多,资源丰富。因此,我们可以使用PWM+简单的RC滤波来实现DAC的输出从而节省成本。

    实际电路的典型 PWM 波形,如图 :
    在这里插入图片描述
    高电平阶段:计数器当前值从0-CCRx阶段(总时间=CCRx*每两个计数之间的间隔时间);
    低电平阶段:计数器当前值从CCRx-ARR-1阶段(总时间=(ARR-1-CCRx)每两个计数之间的间隔时间)。如果PWM内容如果不太懂,可以参考链接:【STM32】通用定时器的PWM输出(实例:PWM输出)。根据PWM的波形,可以用分段函数来进行表示:
    在这里插入图片描述
    其中:T 是单片机中计数脉冲的基本周期,也就是 STM32 定时器的计数频率的倒数。
    N 是 PWM 波一个周期的计数脉冲个数,也就是 STM32 的 ARR-1 的值。n 是 PWM 波一个
    周期中高电平的计数脉冲个数,也就是 STM32 的 CCRx 的值。VH 和 VL 分别是 PWM 波的
    高低电平电压值,k 为谐波次数,t 为时间。我们将①式展开成傅里叶级数,得到公式②:
    在这里插入图片描述
    通过上面的了解,我们可以得到 PWM DAC 的分辨率,计算公式如下:
    分辨率=log2(N)
    这里假设 n 的最小变化为 1,当 N=256 的时候,分辨率就是 8 位。而 STM32 的定时器都是 16 位的,可以很容易得到更高的分辨率,分辨率越高,速度就越慢。
    DA转换原理:
    如果使单片机管脚输出PWM波形,其占空比由小到大逐渐变化,则U1的电压会由小到大逐渐变化,当U1电压超过被测电压时,比 较器的输出端由高电平变为低电平,因此可以认为在该变化的瞬间被测的模拟量与U1的电压相等。 由于U1的电压值=VDD
    D1/(D1+D2),当VDD固定时,其电压值取决于PWM波形的占空比,而PWM的占空比由单片机软件 内部用于控制PWM输出的寄存器值决定,若软件中用1个8位寄存器A来存放RA0输出的PWM的占空比值D1,因此在RA1检测 到由“1”变为“0”的瞬间,A寄存器的值D1即为被测电压的D/A转换值,其D/A转换结果为8位。如果用16位寄存器来作 输出PWM的占空比,则D/A转换值可达到16位。

    展开全文
  • 器件提供出众的动态性能,输出频率为1,200MHz(工作在第3奈奎斯特频带)时,无杂散动态范围(SFDR)为68dB,比同类产品在此输出频率下的SFDR高出14dB。Maxim高速信号处理产品线的常务董事Ted Tewksbury解释说:“Maxim...
  • 1.设计要求 1.输出方波、三角波、正弦波三种波形 2.各种波形幅值、频率在一定范围内可调 3.串口控制波形数据 4.基于stm32f103芯片

    1.设计要求

    1.输出方波、三角波、正弦波三种波形
    2.各种波形幅值、频率在一定范围内可调
    3.串口控制波形数据
    4.基于stm32f103芯片

    2.具体实现

    2.1采样点及精度调整

    /*采样点及精度调整*/
    #define pi 3.1415926
    #define POINT_NUM 128
    #define angle 2*pi/POINT_NUM
    

    2.2 GPIO配置

    初学到这里一开始也很懵逼,明明是输出模拟信号凭啥配置成模拟输入模式?

    后来看了CSDN几篇大神的文章终于明白了:
    因为一但使能 DACx 通道之后,相应的 GPIO 引脚(PA4 或者 PA5)会自动与 DAC 的模拟输出相连。其实,模拟输入通道与模拟输出通道是一起的(本来就是一条通路嘛),其实也可以理解为这里的”输入”是相对于片上外设DAC而言,IO是作为输入,但本质上是一条通路。

    那么如此配置的好处嘞

    1. 可以看到信号行走的路线上(下图红色)没有触发器、数据寄存器和上下拉电阻,所以因它而起的电平跳变噪声和相应的额外功耗就没有了。同时也降低了芯片的动态功耗。
    2. 配置在模拟输入状态的GPIO引脚属于高阻态,这点也有利于保持模拟信号的真实性(说白了,就是信号传输通道无任何信号处理装置,可以将原汁原味的模拟信号在CPU与外设之间进行传输)

    在这里插入图片描述
    给出配置函数:

    void DAC1_GPIO_config(void)
    {	
    	GPIO_InitTypeDef GPIO_InitStructure;
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);		
    	/* DAC的GPIO配置,模拟输入 */
    	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    }
    

    2.3定时器配置

    使用定时器6作为DMA搬运的触发源。
    至此,采样点和定时器配置确定了,输出波形的频率也确定了。
    可以由以下公式计算:
    N是采样点个数,这里设为N=128
    systick有系统时钟频率决定,F1这里为72M。
    为了提高输出信号的带宽,一般把定时器预分频系数设为0。
    在这里插入图片描述

    void DAC1_TIM_Config(void)
    {	
      TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
    	
      /* 使能TIM6时钟,TIM2CLK 为72M */
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
    	
      /*定时器初始周期*/
      TIM_TimeBaseStructure.TIM_Period = 0XF;  
      /* 预分频,不分频 72M / (0+1) = 72M */      									
      TIM_TimeBaseStructure.TIM_Prescaler = 0x0; 
      /*时钟分频系数*/   				
      TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;    					
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  	
      TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
    
      /* 配置TIM6触发源 */
      TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
    	/* 使能TIM6 */
      TIM_Cmd(TIM6, ENABLE);
    }
    

    2.4 DAC与DMA的配置

    首先是DAC配置,这里采用DAC1(32上一共有俩)
    值得注意的是DAC输出缓冲的结构体成员,使能输出缓冲可以提高输出信号的驱动能力,这里不使能。
    其次是DMA配置,查询手册,发现DAC1对应的DMA通道为DMA2-CH3
    这里的外设数据地址要查询手册下面给出地址映射:

    #define DAC_DHR12RD_ADDRESS      (DAC_BASE+0x20) //双通道输出地址
    #define DAC_DHR8R1_Address      0x40007410//DAC通道1 8位输出地址
    #define DAC_DHR12R1    0x40007408   //DAC通道1 12位输出地址
    #define DAC_DHR12R2    0x40007414   //DAC通道2 12位输出地址
    

    在这里插入图片描述
    注意:DMA_BufferSize要和内存数组的大小相对应
    DMA_MemoryDataSize和DMA_PeripheralDataSize要和定义的数据类型相对应

    其他应该没啥好注意的了,下面给出配置代码:

    void DAC1_DMA_Config(void)
    {	
    	DMA_InitTypeDef  DMA_InitStructure;	
    	DAC_InitTypeDef  DAC_InitStructure;
    
    	/* 使能DMA2时钟 */
    	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
    	
    	/* 使能DAC时钟 */	
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    		
    	/* 配置DAC 通道1 */
    	DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;						//使用TIM6作为触发源
    	DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;	//不使用波形发生器
    	DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;	//不使用DAC输出缓冲
    	DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    	
    	/* 配置DMA2 */
    	DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1;					//外设数据地址
    	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;				//内存数据地址 Sine12bit
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;											//数据传输方向内存至外设
    	DMA_InitStructure.DMA_BufferSize = 128;									//缓存大小为POINT_NUM字节									
    	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_MemoryDataSize_HalfWord;					//内存数据以半字为单位	
    	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;													//循环模式
    	DMA_InitStructure.DMA_Priority = DMA_Priority_High;											//高DMA通道优先级
    	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;														//非内存至内存模式	
    	DMA_Init(DMA2_Channel3, &DMA_InitStructure);
    	
    	/* 使能DMA2-14通道 */
    	DMA_Cmd(DMA2_Channel3, ENABLE);
    	/* 使能通道1 由PA4输出 */
    	DAC_Cmd(DAC_Channel_1, ENABLE);
    	/* 使能DAC的DMA请求 */
    	DAC_DMACmd(DAC_Channel_1, ENABLE);
    }
    

    2.5幅值设置及波形数据生成

    每次设置一次vpp就重新更新内存数组
    最大采样值,2的12次=4096

    2.5.1正弦波设置

    void set_sine_vpp(float vpp)
    {
    	int i;	
    	for(i=0;i<POINT_NUM;i++)
    	{
    		Sine12bit[i]= (uint16_t)((sin(i*angle)+1)/2*vpp*4096/3.3);		
    	}	
    }
    

    2.5.2三角波设置

    void set_Triangle_vpp(float vpp)
    {
    	int i;	
    	for(i=0;i<POINT_NUM;i++)
    	{
    		if(i<=POINT_NUM/2 - 1)
    			TriangleWave12bit[i]= (uint16_t)vpp/3.3*4096/(POINT_NUM/2)*i;
    		else
    			TriangleWave12bit[i]= (uint16_t)(vpp/3.3*4096-vpp/3.3*4096/(POINT_NUM/2)*(i-(POINT_NUM/2)));	
    	}			
    }
    

    2.5.3方波设置

    void set_Pulse_vpp(float vpp)
    {
    	int i;	
    	for(i=0;i<POINT_NUM;i++)
    	{
    		if(i<=POINT_NUM/2 - 1)
    			PulseWave12bit[i]= 0;
    		else
    			PulseWave12bit[i]= (uint16_t)(vpp/3.3*4096);	
    	}			
    }
    

    2.6波形切换

    主要就是改变DMA搬运的数据地址,思路简单,下面以切换到正弦波为例:
    但是需要注意的是,一旦申请了结构体,其他的成员也必须赋值,否则配置缺省!

    void change_to_Triangle(void)
    {
    	DMA_InitTypeDef  DMA_InitStructure;
    		
    	DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1;					//外设数据地址
    	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&TriangleWave12bit;				//内存数据地址 Sine12bit
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;											//数据传输方向内存至外设
        DMA_InitStructure.DMA_BufferSize = 128;									//缓存大小为POINT_NUM字节									
    	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_MemoryDataSize_HalfWord;					//内存数据以字为单位	
    	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;													//循环模式
    	DMA_InitStructure.DMA_Priority = DMA_Priority_High;											//高DMA通道优先级
    	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    
    	DMA_Init(DMA2_Channel3, &DMA_InitStructure);	
    }
    

    2.7串口中断

    这里需要注意数据类型的转换
    上位机发送1,2000,3.0
    即可输出2khz,vpp=3.0的正弦波

    void DEBUG_USART_IRQHandler(void)
    {	
    	if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
    	{		
    		ucTemp =USART_ReceiveData(USART1);	
    		UART1_RX_BUF[rx_cnt++]=ucTemp;		
    		if(ucTemp==0x0a)
    		{
    			sscanf((char *)UART1_RX_BUF,"%d,%d,%f",&wave_flag,&freq,&vpp);
    			switch(wave_flag)
    			{
    				case 1:
    				{
    					printf("SET sine_f = %d,sine_VPP = %f\r\n",freq,vpp);
    					Sine.vpp = vpp;
    					Sine.freq = freq;
    					Sine.period = (int)(562500/Sine.freq + 1);
    					set_sine_vpp(Sine.vpp);
    					change_to_sine();
    					set_peroid(Sine.period);								
    					break;
    				}
    				case 2:
    				{
    					printf("SET Triangle_f = %d,Triangle_VPP = %f\r\n",freq,vpp);
    					Triangle.vpp = vpp;
    					Triangle.freq = freq;
    					Triangle.period = (int)(562500/Triangle.freq + 1);	
    					set_Triangle_vpp(Triangle.vpp);
    					change_to_Triangle();						
    					set_peroid(Triangle.period);					
    					break;					
    				}
    				case 3:
    				{
    					printf("SET Pulse_f = %d,Pulse_VPP = %f\r\n",freq,vpp);
    					Pulse.vpp = vpp;
    					Pulse.freq = freq;
    					Pulse.period = (int)(562500/Pulse.freq + 1);	
    					set_Pulse_vpp(Pulse.vpp);	
    					change_to_Pulse();
    					set_peroid(Pulse.period);				
    					break;					
    				}
    				default:break;
    			}
    			rx_cnt = 0;
    	    }	 
         }	 
    }
    

    3. 效果图及源码链接

    在这里插入图片描述

    github源码下载:

    展开全文
  • 器件提供出众的动态性能,输出频率为1,200MHz(工作在第3奈奎斯特频带)时,无杂散动态范围(SFDR)为68dB,比同类产品在此输出频率下的SFDR高出14dB。Maxim高速信号处理产品线的常务董事Ted Tewksbury解释说:“Maxim...
  • DAC7512驱动原理

    千次阅读 2018-04-03 10:06:22
    通过阅读DAC7512的数据手册,其是16位DAC数据,12位精度采集我们可以知道如下信息:因为其最大通信频率可以达到30Mhz,因此其驱动通信协议支持DSPI和SPI,根据下图说明明驱动的时候需要向DAC写进数值,范围0-4095,其...

    通过阅读DAC7512的数据手册,其是16位DAC数据,12位精度采集我们可以知道如下信息:

    因为其最大通信频率可以达到30Mhz,因此其驱动通信协议支持DSPI和SPI,

    根据下图说明明驱动的时候需要向DAC写进数值,范围0-4095,其经过String 寄存器后,数值被

    分配到不同的路径,相应的开启通路的电阻进行分压,得出输出电压


    数据手册上针对如何驱动写明了,数据需要在怕片选拉低的时候送进去有效,

    根据SPI的时序可知时钟线在第一个边沿跳变时数据被写进去,空闲状态为高电平,高位在前,只做从机处理,SPI接三条线:


    根据移位寄存器说明知道16位的数据中,最高两位无效,次高两位用于选择工作模式和低功耗模式,最后12位

    为有效数据。


    因此可以通过上述的说明:

    输出stm32 SPI驱动的程序如下:

    要使其工作需要将最高四位设置为0

    static void SPI_GPIO_Config(void)
    {
            GPIO_InitTypeDef  GPIO_InitStructure;

            RCC_APB2PeriphClockCmd (DAC7512_SPI_GPIO_CLK,ENABLE);
            GPIO_InitStructure.GPIO_Pin   = DAC7512_SPI_CS_PIN;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;     //这里是不是也要推换           
            GPIO_Init(DAC7512_SPI_PORT,&GPIO_InitStructure);


            GPIO_InitStructure.GPIO_Pin   = DAC7512_SPI_SCK_PIN;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;               
            GPIO_Init(DAC7512_SPI_PORT,&GPIO_InitStructure);


            GPIO_InitStructure.GPIO_Pin   = DAC7512_SPI_MOSI_PIN;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;               
            GPIO_Init(DAC7512_SPI_PORT,&GPIO_InitStructure);


            DAC7512_SPI_CS_HIGH();
    }


    static void SPI_Mode_Config(void)
    {
            SPI_InitTypeDef  SPI_InitStructure; 
            RCC_APB1PeriphClockCmd(DAC7512_SPI_CLK,ENABLE);


            SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;   //时钟频率,分频系数不确定
            SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge ;  //这里应该是第一个跳变沿被采集 为SPI_CPHA_1Edge
            SPI_InitStructure.SPI_CPOL = SPI_CPOL_High ;   //空闲为高电平
            SPI_InitStructure.SPI_CRCPolynomial = 0;
            SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
            SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
            SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;   //高位在前
            SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
            SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        


            SPI_Init(DAC7512_SPIx,&SPI_InitStructure);

         SPI_I2S_ClearFlag(DAC7512_SPIx, SPI_I2S_FLAG_TXE); //加上清除
            SPI_Cmd(DAC7512_SPIx,ENABLE);
    }


    void SPI_DAC7512_Init(void)
    {        
            SPI_GPIO_Config();
            SPI_Mode_Config();
    }


    void SPI_DAC7512_Send_Byte(uint16_t data)
    {
            while(SPI_I2S_GetFlagStatus(DAC7512_SPIx,SPI_I2S_FLAG_TXE) == RESET);
            SPI_I2S_SendData(DAC7512_SPIx,data);
    }

    main函数如下:

    uint16_t data1 = 0x00ff;


    int main(void)
    {
            SPI_DAC7512_Init();
      while(1)
            {
                    DAC7512_SPI_CS_LOW;
                    SPI_DAC7512_Send_Byte(data1);
                    Delay(60);
                    DAC7512_SPI_CS_HIGH;        
            }
    }

    展开全文
  • PWM实现ADC和DAC

    万次阅读 2012-02-22 15:35:13
    PWM是脉冲宽度调制,也就是频率固定,占空比可变,信号就是方波,只有高低电平,相当于数字信号,而DAC是模拟输出输出信号在一定程度上和一定范围内可以认为是连续可变的,但是PWM可以通过滤波器实现低精度的DAC...
    1, PWM 和 DAC 区别
    PWM是脉冲宽度调制,也就是频率固定,占空比可变,信号就是方波,只有高低电平,相当于数字信号,而DAC是模拟输出,输出信号在一定程度上和一定范围内可以认为是连续可变的,但是PWM可以通过滤波器实现低精度的DAC功能
    
    
    2, PWM实现ADC和DAC

    一、PWM实现AD<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    利用普通单片机的2个IO及一个运算放大器即可实现AD转换电路,而且很容易扩展成多通道。其占用资源少,成本低,AD转换精度可以达到8位甚至更高,因此具有一定的实用价值。

    图1

    1.1硬件电路说明

    图一中“RA0”和“RA1”为单片机的两个I/O脚,分别将其设置为输出与输入状态,在进行A/D转换时,在程序中通过软件产生PWM,由RA0脚送出预设占空比的PWM波形。RA1脚用于检测比较器输出端的状态。

    R1、C1构成滤波电路,对RA0脚送出的PWM波形进行平滑滤波。RA0输出的PWM波形经过R1、C1滤波并延时后,在U1点产生稳定的电压值,其电压值U1=VDD*D1/(D1+D2),若单片机的工作电压为稳定的+5V,则U1=5V*D1/(D1+D2)。

    图一中的LM324作为比较器使用,其输入负端的U1电压与输入正端的模拟量电压值进行比较,当U1大于模拟量输入电压时,比较器的输出端为低电平,反之为高电平。

    1.2 AD转换过程

    如果使RA0输出PWM波形,其占空比由小到大逐渐变化,则U1的电压会由小到大逐渐变化,当U1电压超过被测电压时,比较器的输出端由高电平变为低电平,因此可以认为在该变化的瞬间被测的模拟量与U1的电压相等。

    由于U1的电压值=VDD*D1/(D1+D2),当VDD固定时,其电压值取决于PWM波形的占空比,而PWM的占空比由单片机软件内部用于控制PWM输出的寄存器值决定,若软件中用1个8位寄存器A来存放RA0输出的PWM的占空比值D1,因此在RA1检测到由“1”变为“0”的瞬间,A寄存器的值D1即为被测电压的A/D转换值,其A/D转换结果为8位。如果用16位寄存器来作输出PWM的占空比,则A/D转换值可达到16位。

    1.3如何减少AD转换的误差

    AD转换的误差主要由以下几个方面决定,分别说明如下:

    (1)单片机的电源电压VDD:在该A/D转换中,VDD电压是造成A/D转换误差的主要原因,如果使VDD电压精度做到较高,则A/D转换误差可以做到很小,在VDD电压精度为0.5%情况下,实际的A/D转换误差小于1%。

    (2)软件产生的PWM占空比:若用于产生PWM的软件设计不良,会使存放占空比的寄存器值与实际输出的PWM占空比不一致,这会导致测量误差。

    (3)比较器输入端的失调电压:该电压对A/D转换精度有一定影响,但影响较小。

    (4)RC滤波电路的纹波:在R1、C1取值不当的情况下,U1处的电压纹波较大,并且延时时间不够,会使A/D转换产生误差,因此R1、C1取值不能太小,但太大又会影响A/D转换速度,推荐使用图一中所示的R1、C1参数,在纹波合理的情况下,其转换误差也可通过软件消除。

    AD转换误差的解决办法:

    (1)对VDD造成的误差,只能通过提高VDD电压精度来解决,它相当于A/D转换的基准电压。

    (2)对于软件中PWM设计不良导致的误差,可修改软件进行解决。

    (3)对比较器及RC滤波电路的纹波导致的误差,在软件中可通过上、下检测法进行消除,即先将PWM的占空比由小到大变化,使U1电压由低往高逐渐变化,在比较器输出端变化时记录其A/D转换值,再将PWM的占空比由大到小变化,使U1电压由高到低变化,在比较器输出端变化时记录其A/D转换值,将两次的A/D转换值进行平均,可有效地消除这两种误差。

    (4)对A/D转换值进行数字滤波,如多次转换求平均值等。数字滤波消除误差的方法很多,在此不再赘述。

    1.4如何提高AD转换的速度

    由于该A/D转换是通过PWM滤波后再进行比较来完成的,其PWM的产生与滤波都需要一定的时间,因此其A/D转换速度较慢,适用于对A/D转换速度要求不高的产品中,其A/D转换速度取决于以下几个方面:

    (1)单片机的运行速度:单片机的运行速度越高则PWM的频率可以越高,RC值就可以取得越小,其延时时间也可以更短,转换速度就更快。

    (2)被测电压值的大小:由于U1电压时是由小到大逐渐加大的,当被测电压值较小时,U1电压上升到相应值的时间就越短,完成A/D转换的速度就越快。

    (3)初始占空比:初始占空比越高,U1电压较大,其上升到被测电压值的时间也就会越短,完成A/D转换的速度也就越快。

    由上所述,A/D转换的速度可以通过提高单片机的工作频率,并在预知被测电压范围时尽可能地设置较高的初始占空比值来加快转换速度,如果所要求的A/D转换精度要求不高,还可以在软件中缩短PWM输出的延时时间来提高A/D转换速度。若单片机带有外部电平变换中断和定时器中断,其A/D转换的精度和速度还可以得到提高。

    二、PWM实现DA

    利用同样的原理,可使该电路很容易的只用单片机的一个I/O脚实现D/A转换功能。其输出的模拟量电压Vout=VDD*D1/(D1+D2)。该输出电压带有纹波,当RC值足够大时,该纹波值几乎为零,可忽略不计。如图2所示。

    图2

    为进一步减小纹波,可使用两级RC滤波。

    此处LM324作为一个跟随器,提高电路的负载能力。

    
    
    
    
    展开全文
  • 工业级质量的高速视频DAC GM7123是一款频率330MHz的3通道10位高速视频DAC芯片,兼容RS-343A/RS-170标准差分输出输出电流范围是2mA~26mA。输入兼容3.3V TTL电平,内部基准1.23V,单电源3.3V供电。时钟50MHz时,...
  • 基于TSMC 0.18 μm CMOS工艺,设计一种10 bit采样率为200 MS/s的DAC(数模转换器)。为了提高DAC的整体性能,电路主体采用了分段式电流舵结构,...在输出信号频率为0.976 MHz时,DAC的无杂动态范围(SFDR)为81.53 dB。
  • 利用DAC0832输出正弦波信号(用示波器观察输出波形),初始频率为50Hz,变频采用“+”、“-”键 控制,实时测量输出信号的频率值,并分析和实测输出信号的频率范围
  • 为了对线性时不变系统进行频率特性进行测试,本设计提出了一种低成本、面向学生的频率特性测试仪的设计方案,本仪器为基于FPGA及高速ADC/DAC构建的数字频率特性测试仪系统。其通过DDS产生正弦扫频信号,经高速DAC...
  • 16bit双通道SPI通信方式,转换时间MAX=10us,时钟频率最大可达到30MHZ;电源电压为2.7~5.5V,采用小型MSOP-8封装,如下图1所示: 该芯片有两个16bit的输出通道,主要应用在便携式设备、闭环伺服器控制、进程控制...
  • es8388双路ADC和DAC的音频编码器_ES8388内置耳机放大器 音功能和可编程音量调节。音频数据接口有I2S,24bit/20bit/16bit Left Right justified,DSP多种格式 立体声输入输出接口的 AD/DA转换器 AdC特点为:24位,8千赫...
  •  然而美中不足的是,由DDS生成的模拟波形在大多数频率下都会有一定的调幅现象,且这种现象在输出频率接近极限频率的情况下尤为明显。本文主要讨论一下这种现象的成因和带来的一些启发。 一、DDS简介 二、DDS产生调...
  • 我们在原始ADC输出处测量静态非线性,并通过反馈路径对其进行补偿,以调整模拟域中的增益,从而避免了传统纯数字校准中的动态范围损失。 所提出的方案通过丢失码发生概率(MCOP)检测错误,该错误对比较器偏移不...
  • 信号发生器仿真系统由51单片机最小系统、LCD12864液晶模块、DAC0832波形转换模块(包括波形幅值与频率转换)、按键控制模块以及示波器测量模块构成。通过Keil平台下的C语言编程,单片机控制输出的数字信号经...
  • 信号的频率范围为0-30MHz带通信号,分为模拟部分和数字部分:其中模拟部 分有模拟音频输入,模拟高频输入和DA模拟输出;数字部分为数字信号处理器 DSP结合ADC实现信号的频谱搬移,达到调制解调功能。硬件系统主要由ADC...
  • GM7123C.pdf

    2019-09-17 11:00:03
    GM7123 是一款频率330MHz的3通道10位高速视频DAC芯片,兼容RS343A/RS170标准差分输出,输出电流范围是2mA~26mA。 输入兼容TTL电平,内部基准1.23V,单电源...DAC输出电流范围2mA~26mA 集成带隙基准电压源 LQFP48封装
  • 器件提供出众的动态性能,输出频率为1,200MHz(工作在第3奈奎斯特频带)时,无杂散动态范围(SFDR)为68dB,比同类产品在此输出频率下的SFDR高出14dB。  MAX19692为电流输出DAC,采用3.3V和1.8V电源供电,具有4:1多路...
  • DAC输出 3x 12 位 1MS/s ADC 输入 42x 12 位 5MS/s 计时器 2x 32 位,10x 16 位,HRTIM HRTIM分辨率 184 秒 通讯接口 4x I2C、4x SPI、6x USART 输出 模拟输出 (DAC) 电压范围: 0-3.3V(1.65V的中点) 分辨率: 12...
  • DSP集成的AIC23芯片的音频接口

    千次阅读 2014-03-31 02:02:52
    AIC23的模数转换(ADCs)和数模转换(DACs)部件高度集成在芯片内部,采用了先进的Sigma-delta过采样技术,可以在8K到96K的频率范围内提供16bit、20bit、24bit和32bit的采样,ADC和DAC输出信噪比分别可以达到90dB...
  • 通过稳压电流源将220V...输出正弦波的频率变换范围是30HZ到300HZ,三角波的频率范围为20Hz到180Hz,锯齿波的频率范围为30HZ到360HZ,方波的频率范围为900HZ到15KHZ。 关键词:汇编语言 稳压电源 DAC0800 AT89C52单片机
  • 数控陷波器

    2012-07-22 11:32:41
    输入信号在1kHz~3kHz频率范围内,为了实现高速、高精度测量,利用FPGA测量相位和频率,幅值检测通过测量有效值的方法实现,可控增益放大器部分采用DAC904输出控制AD9832的基准电压,实现了输出增益的动态调整。...
  • 应用C8051F330单片机内DAC设计制作一个简单的函数信号发生...1. 输出波形的频率范围为100Hz~20kHz;频率可调,频率步进间隔≤100Hz。 2. 输出波形幅度范围0~3V(峰-峰值)。 3. 具有显示输出波形的类型、频率的功能。
  • 杰理AC690X系列---RGB彩灯随音乐跳动(10)

    千次阅读 热门讨论 2018-04-09 17:11:57
    最近做了不少跟RGB彩灯有关的项目,印象比较深刻的是火焰灯效果,还有一个是彩灯随音乐跳动。关于彩灯随音乐跳动其实分两种,一种是随频率跳动,一种是随输出...因为涉及到获取DAC输出的具体频点幅值,本人未找到相...
  • 0832和0809组合应用.doc

    2008-12-28 12:22:06
    (2)输出波形的频率范围为100Hz~1kHz,步进为100Hz。 (3)输出波形幅度范围1~5V(峰-峰值),可按步进1V(峰-峰值)调整。 (4)通过ADC0809采样DAC0832的输出,在屏幕上画出图形。示波器查看波形发生器的输出和...
  • 【STM32学习2】简易函数发生器与示波器制作

    千次阅读 多人点赞 2020-09-13 22:39:36
    本题目的制作采用正点原子STM32F407探索者开发板作为硬件平台,用TFTLCD屏幕制作交互界面,显示信号波形和测量的频率和峰峰值,用STM32片内DAC输出正弦波与方波(频率范围为100Hz到10kHz,电压峰峰值范围为0.1-3.3V...
  •  输出频率范围为0MHz-12.5MHz;  频率寄存器为28位(在25MHz的参考时钟下,精度为0.1Hz);  可选择正弦波、三角波、方波输出;  无需外界元件;  3线SPI接口; 温度范围为-40℃-+105℃。 2 AD9833的结构及功能 ...
  • 这是一个可以测量电压,频率...按下S5键的时候,DAC输出一个定值,再按一下,输出的电压和输入的一样,默认情况是输出的电压和输入的一样。按下S6键的时候,关LED。再按一下开。按下S7键的时候,关数码管。再按一下开。

空空如也

空空如也

1 2 3 4 5
收藏数 89
精华内容 35
热门标签
关键字:

dac输出频率范围