精华内容
下载资源
问答
  • 介绍泰克3000系列信号发生器使用及维护,对于它的一些参数也有着详细的说明。
  • 基于FPGA的信号发生器的设计讲解
  • VP8191A原装日本松下VP8191A全数字显示VP8191A/AM/FM信号发生器VP8191A 100Khz-135MHZ •; 频宽100KHz~135MHz •;输出电压:-17.9~132dB •;FM调制失真率0.05%以下 •;AM调制失真率0.5%以下 •;具备100种...
  • 基于protues的信号发生器,protues详细教程,示波器。本来是做一个项目,我把收集到的一些东西,整理好了,打包下载。
  • 单片机信号发生器

    2012-12-10 22:05:48
    信号发生器用单片机做主控芯片,按键控制实现信号切换、频率调节LED显示的详细过程,该设计本是设计报告,也可以做单片机初学者的项目教程
  • 信号发生器使用说明

    2017-03-25 11:08:00
    转载于:https://www.cnblogs.com/lrj527/p/6616501.html

     

    转载于:https://www.cnblogs.com/lrj527/p/6616501.html

    展开全文
  • 单片机的应用开发,外设的综合运用,纵使智能产品设计多么复杂,但其实现的基本功能都离不开MCU的电路设计与驱动编程,无论是使用51单片机还是AVR单片机,其方案的选择因项目需求而定,需要这方面资料的工程师们,看...
  • 单片机的应用开发,外设的综合运用,纵使智能产品设计多么复杂,但其实现的基本功能都离不开MCU的电路设计与驱动编程,无论是使用51单片机还是AVR单片机,其方案的选择因项目需求而定,需要这方面资料的工程师们,看...
  • 根据eda技术实用教程来设计的DDS任意信号发生器
  • 基于FPGA的信号发生器

    2019-01-10 23:26:18
    1. 信号发生器在同一端口能产生正弦波、锯齿波、方波、和三角四种周期性波形。 2. 输出频率范围10Hz~10MHz。 3. 实现输出信号频率和幅度可调节。 1.根据设计要求,合理选择系统所需的外设组件,并完成相应电路的设计...
  • 单片机的应用开发,外设的综合运用,纵使智能产品设计多么复杂,但其实现的基本功能都离不开MCU的电路设计与驱动编程,无论是使用51单片机还是AVR单片机,其方案的选择因项目需求而定,需要这方面资料的工程师们,看...
  • 170、基于PLL信号发生器的设计论文资料.rar
  • 30、基于PLL信号发生器的设计论文资料.rar
  • 单片机控制10BitDA正弦信号发生器 PROTEUS 和51单片机教程 功能:单片机驱动 10BitDA正弦信号发生器 用示波器测量弦波形
  • 第12章 示波器设计—DAC信号发生器的实现 本章节为大家讲解二代示波器中信号发生器的实现。这个功能还是比较实用的,方便为二代示波器提供测试信号。实现了正弦波,方波和三角波的频率,幅度以及占空比设置。 12.1...

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=45785

    第12章      示波器设计—DAC信号发生器的实现

    本章节为大家讲解二代示波器中信号发生器的实现。这个功能还是比较实用的,方便为二代示波器提供测试信号。实现了正弦波,方波和三角波的频率,幅度以及占空比设置。

    12.1   DAC的输出阻抗和使能缓冲问题

    12.2   DAC驱动实现

    12.3   信号发生器配置界面设计

    12.4   信号发生器波形显示效果

    12.5   总结

     

     

    12.1  DAC的输出阻抗和使能缓冲问题

    我们这里把F429的输出阻抗和使能缓冲问题放在最前面说。

    使能了多缓冲后发现有失真问题,即满幅输出的时候有削顶和削底,而禁止了输出缓冲会导致输出阻抗仅有10KΩ左右,外接负载很容易造成分压(可以根据实际情况,外接运放输出)。

    F429的手册中对于DAC的几个关键特性说明如下:

    1、开启缓冲的时候,外接的负载阻抗最小得是5KΩ。

    2、禁止缓冲的时候,DAC输出阻抗最大可达15KΩ,比如要实现1%精度的输出,外接负载阻抗至少得是1.5MΩ。

    3、开启缓冲的时候,最小输出电压0.2V,最大Vdda - 0.2V,这个应该是造成削顶问题的根本原因。

    4、禁止缓冲的时候,最小输出电压的典型值是0.5mV,最大输出是Vref - 1LSB。基本正好满幅输出,所以效果比较好。

     

    F429数据手册中几个关键参数的截图:

    缓冲和外接负载时的框图:

    禁止缓冲时,满幅输出效果比较漂亮:

    使能缓冲时,满幅输出效果,出现削顶问题:

    有了上面的感性认识后,下面为大家讲解DAC的驱动实现和相应的GUI界面实现。

     

    12.2  DAC驱动实现

    F429带有两个DAC,分别是DAC1和DAC2,我们这里使用了DAC1,驱动中还需要用到TIM6和DMA,方便我们配置不同的的频率,占空比和幅值。

     

    12.2.1  第1步:引脚配置和DAC配置

    配置代码如下,使用的PA4引脚做输出:

    /*
    
    *********************************************************************************************************
    
    *    函 数名: bsp_InitDAC1
    
    *    功能说明: 配置PA4/DAC1
    
    *    形    参:无
    
    *    返 回值: 无
    
    *********************************************************************************************************
    
    */
    
    void bsp_InitDAC1(void)
    
    {   
    
         /* 配置GPIO */
    
         {
    
             GPIO_InitTypeDefGPIO_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_InitTypeDefDAC_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。关于DAC的缓冲问题,看前面12.1小节说明即可。

     

    12.2.2 第2步:DAC的定时器触发和DMA配置

    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_tusPeriod;
    
         uint16_tusPrescaler;
    
         uint32_tuiTIMxCLK;
    
         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; /* 自动重装的值 */
    
             }
    
             elseif (_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_InitTypeDefDAC_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_InitTypeDefDMA_InitStructure;
    
     
    
             RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
    
     
    
             /* 配置DMA1 Stream 5channel 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的配置。F429的定时器从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。正是因为这个原因,程序中对不同的输出频率做了范围区分。

     

    12.2.3 第3步:正弦波输出配置

    正弦波的输出配置如下:

    /*
    
    *********************************************************************************************************
    
    *    函 数名: dac1_SetSinWave
    
    *    功能说明: DAC1输出正弦波
    
    *    形    参:_vpp : 幅度 0-4095;
    
    *               _freq : 频率
    
    *    返 回值: 无
    
    *********************************************************************************************************
    
    */
    
    void dac1_SetSinWave(uint16_t _vpp, uint32_t_freq)
    
    {   
    
         uint32_ti;
    
         uint32_tdac;
    
        
    
         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)。

     

    12.2.4 第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_ti;
    
         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)。

     

    12.2.5 第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_ti;
    
         uint16_tdac;
    
         uint16_tm;
    
        
    
         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)。

     

    12.3 信号发生器配置界面设计

    信号发生器的界面设计如下:

    这个操作界面简单易用,支持正弦波,方波和三角波的切换,支持占空比设置,支持幅值设置,同时也支持频率设置,限制频率范围1Hz到50KHz。超过50KHz的话,波形效果会变的越来越差。

    关于这个对话框的代码实现就不在教程里面做讲解了,我们这里主要讲解下对话框上的小键盘实现。这里小键盘是一个独立的窗口,父窗口是信号发生器主窗口,通过函数WM_SendMessageNoPara发自定义消息给父窗口,在父窗口里面更新Graph控件的波形和波形信息,同时DAC的波形输出也得到更新。了解了这知识点后,再看代码就比较容易了。

     

    知识点拓展:

    新版emWin教程第51章:实用的官方小键盘实例讲解:

    http://forum.armfly.com/forum.php?mod=viewthread&tid=19834

    另外还有emWin提高篇例子的第一期ATM机里面也有用到小键盘。

    http://forum.armfly.com/forum.php?mod=viewthread&tid=23687

     

    12.4 信号发生器波形显示效果

    下面为大家展示信号发生器输出波形效果:

    方波:

    正弦波:

    三角波:

     

    12.5 总结

    本章节为大家讲解的信号发生器还是比较实用的,建议实际动手操作下,有兴趣的话,还可以进一步优化升级。

     

     

    展开全文
  • 基于labview的函数信号发生器的设计 1.设计主要内容及要求; 设计基于Labview 的函数信号发生器。 要求:1)掌握NI-DAQ使用方法。 2)了解函数信号产生方法。 3) 输出一路占空比可调的方波信号,一路函数...
  • 简易信号发生器的设计

    千次阅读 2019-09-24 09:17:38
    晚上写了一个简易的信号发生器的程序,上机验证成功,通过了 Signal Tap II验证。 Mif 文件的数据是通过 mif_maker2010 这个软件生成的,它的使用教程通过这个链接可以找到:...

         晚上写了一个简易的信号发生器的程序,上机验证成功,通过了 Signal Tap II验证。

         Mif 文件的数据是通过  mif_maker2010 这个软件生成的,它的使用教程通过这个链接可以找到:https://www.cnblogs.com/qidaiymm/p/6007704.html

         硬件环境为:DE1-SOC

         软件环境为:Quartus II_15.0

         可以通过四个拨码开关来进行波形及频率的切换,那个ROM-1 PORT的使用我就不介绍了

         实现的效果为:

         

        

      

    代码如下:

    模块1:

    module control_freq(
      clk,
      rst_n,
      key_in,
      fout
    );
    input clk;
    input rst_n;
    input[1:0] key_in;
    output fout;
    reg[3:0] cnt;
    reg clk_2,clk_4;
    reg fout;
    always@(posedge clk or negedge rst_n) 
      if(!rst_n)
        begin
          cnt<=4'd0;
      clk_2<=0;
      end
      else if(cnt==4'd1)
        begin
          cnt<=4'd0;
      clk_2<=~clk_2;
      end
      else
        cnt<=cnt+1'b1;
    always@(posedge clk_2 or negedge rst_n)
      if(!rst_n)
        clk_4<=0;
      else
        clk_4<=~clk_4;
    always@(posedge clk or negedge rst_n)
     begin
       if(!rst_n)
       fout<=0;
     else
       begin
        case(key_in)
          0:fout<=clk_2;
        1:fout<=clk_4;
        default:;
          endcase
         end
     end
     
    endmodule
     
    模块2:
    module sw_control(
      clk,
      rst_n,
      data_out,
      sw
    );
    input clk;
    input rst_n;
    input[1:0] sw;
    output[7:0] data_out;   //数据输出
    reg[7:0] address;
    wire[7:0] q1,q2,q3;       //地址寄存器
    reg[7:0] data_out;
    always@(posedge clk or negedge rst_n)
      if(!rst_n)
        address <= 8'd0;
      else if(address==255)
        address <=8'd0;
      else
        address <= address +1'b1;
     
    san_jiao_xing san_jiao_xing(
     .address(address),
     .clock(clk),
     .q(q1)
    );
    sin sin(
       .address(address),
     .clock(clk),
     .q(q2)
    );
    fang_bo fang_bo(
       .address(address),
     .clock(clk),
     .q(q3)  
    );
    always@(posedge clk or negedge rst_n)
      begin
        if(!rst_n)
          data_out<=8'd0;
        else
          begin
            case(sw)
          0:data_out<=q1;
        1:data_out<=q2;
        2:data_out<=q3;
        default:data_out<=8'd0;
            endcase
          end
      end
    endmodule
     
    //顶层模块
    module AD_pulse_signal_generator(
      clk,
      rst_n,
      key_in,
      sw,
      data_out
    );
    input clk;
    input rst_n;
    input[1:0] key_in;
    input[1:0] sw;
    output[7:0] data_out;
    control_freq u1(
      .clk(clk),
      .rst_n(rst_n),
      .key_in(key_in),
      .fout(fout)
    );
    sw_control u2(
      .clk(fout),
      .rst_n(rst_n),
      .data_out(data_out),
      .sw(sw)
    );
    endmodule
     
    欢迎各位朋友批评指正~

     

    转载于:https://www.cnblogs.com/571328401-/p/10581519.html

    展开全文
  • 信号发生器是电子爱好者常用的工具,然而一般传统的信号发生器都难以产生特别精确的简谐波形(倒是方波、三角波容易些),复杂的函数就更不要说了,需要花费巨额资金去实现。现在好了,利用现代计算机强大的...

    信号发生器是电子爱好者常用的工具,然而一般传统的信号发生器都难以产生特别精确的简谐波形(倒是方波、三角波容易些),复杂的函数就更不要说了,需要花费巨额资金去实现。现在好了,利用现代计算机强大的计算能力、Adobe Audition软件的灵活设计和声卡的精确输出,任意的音频信号都不在话下!

    1. Adobe Audition与Cool Edit

    现在说Adobe Audition可能了解的人不多。但要说起Cool Edit,只怕知道的不是少数,而且许多人接触过这个由Syntrillium Software公司出品的著名的音乐编辑软件。事实上《无线电》在2002年就介绍过Cool Edit 2000。Adobe Audition 1.0其实就是由Cool Edit Pro 2.1换名变化而来的,因为2003年中期Adobe公司将Syntrillium公司全部产品都收购了,用于充实其阵容强大的视频处理软件系列,其时Cool Edit Pro 2.1才发布不久。

    以前对Cool Edit 2000的介绍太片面,很多实用的强大功能没有认识到。事实上Cool Edit系列软件作为音频虚拟仪器的功能都是非常强大而全面的,都能够提供高达96 kHz的波形发生、图示分析分析功能(只不过一般多媒体声卡不能处理超声信号,但高级专业声卡是可以精确处理的)。特别是Cool Edit 2000之后的Cool Edit Pro 2.0、2.1版本,做出了许多卓有成效的改进,与我们作为虚拟仪器的使用有关的则是在波形生成和频谱分析方面有了很大进步,使得波形分析和数据处理变得十分容易,而在CoolEdit2000中则有很多局限。

    Adobe Audition 1.0完全继承了Cool Edit Pro 2.1的特征,而拥有正版Cool Edit Pro 2.0、2.1的用户可以免费升级到Adobe Audition 1.0。如果想试用,Adobe公司提供试用版本,全部功能开通,试用期30天。大家可以到http://www.adobe.com公司网站去下载。不过官方网站的下载过程有点复杂,我们为大家寻找到了一个可以快速下载的通道——http://www.zdnet.com.cn/download/windows/system/swinfo/0,2008005299,39048180s,00.htm

    2. 生成简谐波形

    软件安装后打开,首先显示试用期限画面,点击“Try”按钮,就可以开始试用了。首次启动的默认界面如图1所示。

    图1

    这是“Multitrack View”,即多轨混排界面,一般用于音乐编排,于我们用处不大。可以点击工具栏最左边的“Switch to Edit View”(切换到编辑界面),即可变成图2所示的编辑处理界面。

    图2

    快来试试怎么用!在这里点击“新建波形”按钮,就会弹出图中上浮的对话框,要求你选择“Sample Rate”(取样频率)、“Channels”(声道数)和“Resolution”(分辨率)。对于电脑多媒体声卡,一般用48KHz的取样频率、双声道、16bit分辨率。如果要符合CD标准,则可选取44.1 KHz的取样频率。而如果你有高档声卡,可以一直取到192 KHz取样频率,32bit分辨率。

    生成波形的最高频率与取样频率直接相关。根据奈奎斯特(Nyquist)取样原理,模拟波形的最高频率为取样频率的1/2。但实际上在接近1/2取样频率时软件生成的波形本身就很不正常了,因此CD标准用44.1 KHz的取样频率来生成最高20KHz的信号就可以理解了。有人采用低的取样频率而抱怨最高频率有限,或虽然采用高的取样频率却希望精确输出1/2取样频率的波形,那都是不理智的。

    选定参数后点击菜单栏的“Generate -〉Tones”(生成 -〉波形)按钮,即弹出图3所示的对话框,要求输入波形参数。

    我们先产生一个最常用的信号,即1KHz正弦波。在“Base Frequency”(基本频率)栏目添入1000,将“Lock to these settings only”(固定设置)选中,在“General Flavor”(波形类型)栏目选择“Sine”(正弦波),“Duration”(长度)栏目添入波形长度10秒,“dB Volume”(音量,波形幅度)栏设置成-6 dB(半满幅),其余项目选择默认即可。生成的波形如图4所示。

    图3

    图4

    窗口左下角有两个工具栏,分别是“录放工具”和“缩放工具”,都用图标表示,而且有提示,可以进行灵活自如的操作,非常容易使用,这里就不详述了。值得一提的是波形窗口的拖动缩放功能,将光标移到其底部的时间标尺上按下鼠标右键拖动,光标即变成一个放大镜标志,拖动完后放开鼠标,窗口即显示拖动过的部分。图中显示的是正在拖动的例子。另外如果用左键拖动,则是用“手”移动波形,将“手”移到标尺外侧,波形将自动滚动显示。用上述方法可以方便快捷地显示希望的部分。

    显示全部波形,点击“播放”键试试,怎么样,声音放出来了吧?选择菜单栏“File -〉Save as”(文件 -〉保存为)命令,将按照跟其它标准的Windows应用程序一样的方法保存波形到文件,想必大家都会,不用详述了吧。

    3. 生成调频波形

    调频波的产生由三个参数决定:“Base Frequency”(基频,载波频率)、“Modulate By”(调制带宽,调制范围)、“Modulation Frequency”(调制频率)。这三个参数的含义容易令人迷惑,而且帮助文件里的介绍也不容易理解,笔者费了很多工夫试验分析才弄明白,作出如上翻译,希望读者注意。“Modulate By”(调制带宽,调制范围)的作用是设定在基频上下的多大范围作调制,而“Modulation Frequency”(调制频率)才是真正用来调制基频的调制频率。例如,基频选1000 Hz,调制范围选100 Hz,调制频率选50 Hz,将产生在900 Hz至1100 Hz间以50 Hz步长被50 Hz调制的调频波(实际上带外要产生谐波调制,不过衰减较快)。一般情况下调制范围与调制频率接近即可,虽然这样不容易看清调制的情况,但更接近实用。如果单作为演示看,可以加大调制范围,调制频率取1/10基频。例如基频选1000 Hz,调制范围选500 Hz,调制频率选100Hz,生成的波形如图5A所示,疏密相间的频率调制波形很直观。如果调制范围选得太小,则调制幅度小,但频率成分很纯,反之调制幅度大但频率成分很杂,如果调制范围选0,则不会发生调制(所以我们在生成正弦波时不必理会调制频率)。

    图5

    4. 生成调幅波形

    用Adobe Audition产生调幅波同样很方便,不过要分两步走。第一步,将基频设定成预期值,调制范围和调制频率设为0,产生基频;第二步,将第一步产生的基频全部选中高亮(即刚生成波形时的默认状态),点击“GenerateàTones”,在弹出的对话框中选值,基频与第一步相同,调制范围和调制频率设为预期值(二者相同将产生单频调制,调制范围小调制弱,而调制范围大时则为多频调制),再选中对话框下部中间部分的“Overlap(mix)”(重叠混合)选项,另外音量设置不能太高,否则容易发生削顶失真。可以进行二次、三次调制,产生复杂的调制波形。例如基频设定1000 Hz,调制范围选100 Hz,调制频率选100Hz,音量设置选-9 dB,产生的波形如图5B所示。

    另外一种调幅波产生方法将产生过零的调幅波。在第二步基频设定100 Hz(1/10基频),调制范围选0,然后选中对话框下部中间部分的“Modulate”(调制),即可产生图5C所示的调制波形。这样产生的调幅波可以用同样的设置再执行“DeModulate”(解调)来还原。而这时如果执行“Overlap(mix)”(混合)命令,将得到图5D所示的复合音。

    5. 生成扫频

    音频扫频仪是测试音响系统非常需要的设备,以前我们个人很难有条件拥有高精度的扫频仪,而如今,用Adobe Audition产生扫频易如反掌!

    产生正弦波时将“Lock to these settings only”解除选定,将变为图6所示的界面。在这里你可以设定“Initial Settings”(开试设置)和“Final Settings”(结束设置)两个页面。

    图6

    初试设置与产生单频正弦波一样,而结束设置则增加了一个“Log Sweep”(对数扫描)点选框,将其选中,即可产生扫描速度对数增加的扫频信号。其好处是低频与高频的波形个数是一样的。而如果不选则产生线性扫频信号,需要很长的时间才能产生低频完整波形。我们将开始频率设为20 Hz,结束频率设为20KHz,产生一段10秒的对数扫频,其前3秒的波形如图7所示。

    图7

    6. 生成三角波、方波

    在“General Flavor”(波形类型)栏目有四个点选项目,即“Sine-Triangle/Sawtooth-Square-Inv Sine”(正弦-三角/锯齿-方波-反正弦),选择“三角/锯齿”或“方波”,即可方便地生成需要的波形。

    这时窗口频率设置项下方的“Flavor Characteristic1”(波形特征)将变成图8A、8B所示的样子,在这里你可以自由设置三角/方波的特征。图8A为三角波设置参数。可以填入0至100的数值来决定三角波上升时间比例。50%为纯粹的三角波,而0%或100%则成为下降/上升的锯齿波。图8B为方波设置参数。可以填入0至100的数值来决定方波正值所占时间比例。

    图8

    7. 生成复合音

    复合音可以产生很多奇妙的效果,检测音频设备的互调失真也很有用。复合音是由基频和多至四个的“Frequency Components”(频率组件)构成的。事实上上述图5D所示就是复合音,由此可见复合音的产生也是有多种方法的,不过复杂的复合音还是以下方法好用。参考图9 ,这是软件预设的“Bell”(钟声)的构成情况,由基频220 Hz正弦波100%幅度、第一组件1.02倍基频28%幅度、第二组件0.98倍基频14%幅度、第三组件4倍基频22%幅度、第四组件7倍基频39%幅度组成,然后经1.5 Hz调制频率在2 Hz带宽内调频,右声道延迟15°相位构成,变化至结束时各参数均改变,请参考实际应用,此处不再详述。

    图9

    对我们的虚拟仪器应用来说,能够产生几个纯音复合就够用了,不必进行复杂的调制和变化,那样反而不容易分析。我们也可以将自己编辑的复合音设置保存起来供调用。点击“Presets”旁的“Add”键即可添加保存。

    8. 技巧进阶

    根据上述内容,想必大家已能领略到Adobe Audition生成波形的强大威力了。不仅如此,配合下述的技巧和以后介绍的编辑功能,你真的能产生几乎任意想要的波形,说“万能”并不很夸张。

    在生成正弦/反正弦波形时,“Flavor Characteristic1”框内可以填入任意的实数来决定波形的指数。默认的“1”当然是基本波形了,我们甚至可以填入小数、负数来产生任意次方的波形!

    “Phasing”(相位)栏可以设置波形的相位特征。这里你可以设置“Start Phase”(开始相位,指左声道)、“Phase Difference”(相位差)和“Change Rate”(变化率)是指右声道相位相对于左声道的相位差和变化率。如果设定了相位变化率,频率也会随着变化。

    在“Generate”菜单栏还有三个项目,分别是“Silence”(静音)、“DTMF Signals”(双音多频信号)和“Noise”噪音。

    “静音”即数字0信号,可以在波形片段间插入绝对静寂。而“双音多频信号”即电话拨号音,你只需输入数字和字母即可得到标准的电话拨号音,甚至可以自由设计双音多频信号的特征!

    图10

    “噪音”也需要产生?!是的,这可不是随随便便的噪音,而是频谱非常精确的噪音!如图10所示,你可以选择噪声的“Color”(颜色)为“Brown”(褐噪声)、“Pink”(粉红噪声)或“White”(白噪声)。这是借用了光谱分析中的术语而得来的,因为它们与对应的颜色频谱规律类似。褐噪声的频谱线幅度随频率增加而以-6dB/oct(每倍频程-6dB)的斜率衰减,而粉红噪声则为以-3dB/oct(每倍频程-3dB)的斜率衰减,白噪声则保持恒定。这里产生的噪声频谱极宽,全部为从0至1/2取样频率,使用时要注意防止损坏被测设备。如果希望只用音频范围,可以用以后介绍的编辑方法处理。

    “Style”(类型)是针对双声道间的关系而言的。在“Spatial Stereo”(空间立体声)输入框内填入数值可以产生相关的立体声噪音,而“Independent Channels”(独立声道)则产生互不相干的两声道,“Mono”(单声道)则两声道相同,“Inverse”则两声道间反相。怎么样,模拟设备做不到吧?

    “Intensity”(强度)用来设定噪声的总幅度。只有粉红噪声才能设到最高值40,白噪声和褐噪声必须分别限制在12、18以下,否则会发生削顶失真。还有一些项目未能尽述,大家可以参考帮助文件自行探索。

    展开全文
  • 十一、四通道幅频相可调DDS信号发生器 本文由山东大学研友袁卓贡献,特此感谢 实验目标 实现多通道可调信号发生器 实验平台 芯航线FPGA核心板、ADDA模块 实验现象 实现基于FPGA的多通道可调信号发生器...
  • 瑞特 SG10xx系列 双路直接数字合成信号发生器 完整的说明书,适用于SG1005、SG1010、SG1015、SG1020四个型号。 吐槽下:刚买到手,连个说明书都没有!!在网上搜索了一堆,竟然没有找到,后来找人要到了。
  • 基于 FPGA Vivado 信号发生器设计(附源工程)

    千次阅读 热门讨论 2020-06-15 10:03:00
    今天给大侠带来基于 FPGA Vivado 信号发生器设计,开发板实现使用的是Digilent basys 3,如有想要入手basys3开发板的,可以联系牛总:18511371833。话不多说,上货。 本篇掌握基于 FPGA Vivado 信号发生器设计...
  • 如何将一个波形文件下载到安捷伦信号发生器中,并在信号发生器中调用波形文件的具体操作流程
  • 基于labview的虚拟信号发生器的设计
  • 基于FPGA的DDS信号发生器 Verilog资料合集,包含源码工程、仿真工程、视频教程、原理图PCB图,是FPGA经典案例系列博客的其中资源之一,系列博客地址:https://blog.csdn.net/qq_33486907/article/details/118653742 ...
  • 基于labVIEW的函数信号发生器 本文是基于labview环境下自行开发的虚拟函数信号发生器,他能够产生实验室常用的正弦波、方波、三角波、锯齿波信号;对信号频率、幅度、相位、偏移量可调可控;方波占空比可以调控。 1....
  • 内附matlab函数脚本文件、matlab build出的jar文件和java源代码 环境的配置上网查教程
  • cpld vhdl 信号发生器 正弦波 方波 三角波
  • 因为课题需要和个人兴趣,导师给了个用fpga设计脉冲信号发生器的任务,又买了个cyclone iv的开发板(黑金的),看了附送的教程后把代码写好了,下载运行情况不错。然后就是画板子了。 由于任务比较多,画板子有点赶...
  • 本文主要记述,本人使用Tektronix(泰克)的 AFG3101 型号的任意函数发生器(Arbitrary Function Generator) 和 AWG520 型号的任意波形发生器 (Arbitrary Waveform Generator)的一些经验方法,介绍了自己想到的...
  • 利用赛灵思公司 A7 系列板卡 EG01、AD9226 模块和 DAC904 模块, 制作一个便携式、宽频带的示波和 DDS 信号源,两者二合一,既能产生信号波形又可以实现示波的基本功能。 1.2 应用领域 DDS 信号源可以产生...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,606
精华内容 7,042
关键字:

信号发生器使用教程