3256|6

18

帖子

2

TA的资源

一粒金砂(中级)

楼主
 

电信号测量仪的电路怎么设计啊? [复制链接]

电子设计题目要求:


一、设计任务
设计并制作一台数字显示的多功能电信号测量仪
二、要求
1、基本要求
(1)频率测量:可测量方波、正弦波;频率:0.1Hz~64KHz,测量误差≤0.1%。
(2)幅值测量:可测量方波、正弦波;幅度(峰值): 0.1V~5V;测量误差≤0.1%。
(3)采用LED或LCD显示十进制数字,可同时显示幅值和频率。

真心不知道该怎么实现。为之奈何啊?谁有没有好想法啊?
谢谢…_…     附上我的ADC采样程序跟方波频率程序,太拙了

/*ADC采样,1HZ */
#include
#include
#include"inc/hw_memmap.h"
#include"inc/hw_types.h"
#include"inc/hw_ints.h"
#include"driverlib/sysctl.h"
#include"driverlib/gpio.h"
#include"driverlib/timer.h"
#include"driverlib/adc.h"
#include"driverlib/pin_map.h"
#include"driverlib/debug.h"
#include"driverlib/interrupt.h"
#include"LCD_module.h"
uint32_t ui32ADCData[1];
float ADC_Value = 0;
uint32_t ui32Period = 0;
uint32_t ui32PinRead ;
uint32_t ui32TOF = 0;
void IntHandler()
{
    uint32_t ui32Status = 0;

    GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6,0x00);
    SysCtlDelay(2000000);

    ui32Status = ADCIntStatus(ADC0_BASE,3,false);
    if(ui32Status && ADC_INT_SS3)
    {
        ui32TOF = 1;
        ADCSequenceDataGet(ADC0_BASE, 3, ui32ADCData);
        ADC_Value = (3.3) * (ui32ADCData[0]) / 0xFFF;
    }
    ADCIntClear(ADC0_BASE,3);
}
int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_6);


    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_1);
    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1, 0x02);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    TimerConfigure(TIMER0_BASE,TIMER_CFG_PERIODIC);
    ui32Period = SysCtlClockGet();
    TimerLoadSet(TIMER0_BASE,TIMER_A,ui32Period - 1);
    TimerADCEventSet(TIMER0_BASE,TIMER_ADC_TIMEOUT_A);
    TimerEnable(TIMER0_BASE,TIMER_A);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
    GPIOPinTypeGPIOInput(GPIO_PORTE_BASE,GPIO_PIN_0);
    GPIOPadConfigSet(GPIO_PORTE_BASE,GPIO_PIN_0,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
    GPIOPinTypeADC(GPIO_PORTE_BASE,GPIO_PIN_0);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
    ADCSequenceConfigure(ADC0_BASE,3,ADC_TRIGGER_TIMER,0);
    ADCSequenceStepConfigure(ADC0_BASE,3,0,ADC_CTL_CH3|ADC_CTL_IE|ADC_CTL_END);
    ADCIntRegister(ADC0_BASE,3,IntHandler);
    IntEnable(INT_ADC0SS3_TM4C123);
    ADCIntEnable(ADC0_BASE,3);
    ADCSequenceEnable(ADC0_BASE,3);
    IntMasterEnable();

    LCD_pin_init();
    LCD_initialization();
    LCD_clear_screen();

    while(1)
    {
        TimerControlTrigger(TIMER0_BASE,TIMER_A,true);
        GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6,0x40);
        LCD_string_16x8(1,1,"ADC_V = ");
        LCD_num_16x8(2,1,0,ADC_Value);
        LCD_num_16x8(3,1,0,ui32TOF);
    }
}





/*Frequence Counter*/

#include
#include
#include"inc/hw_memmap.h"
#include"inc/hw_types.h"
#include"inc/hw_ints.h"
#include"LCD_module.h"
#include"grlib/grlib.h"
#include"driverlib/sysctl.h"
#include"driverlib/gpio.h"
#include"driverlib/debug.h"
#include"driverlib/pin_map.h"
#include"driverlib/interrupt.h"
#include"driverlib/timer.h"
uint32_t ui32Time[5];
uint32_t t = 0;
uint32_t ui32Freq = 0;
uint32_t ui32Period = 0;
uint8_t ui8State = 0;
uint32_t ui32TD = 1;

int main(void)
{
    SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE,GPIO_PIN_6);
    GPIOPinWrite(GPIO_PORTA_BASE,GPIO_PIN_6,0x00);

    GPIOPinTypeGPIOInput(GPIO_PORTB_BASE,GPIO_PIN_4);
    GPIOPadConfigSet(GPIO_PORTB_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
    GPIOPinConfigure(GPIO_PB4_T1CCP0);
    GPIOPinTypeTimer(GPIO_PORTB_BASE,GPIO_PIN_4);
    LCD_pin_init();
    LCD_initialization();
    LCD_clear_screen();

    TimerConfigure(TIMER0_BASE,TIMER_CFG_PERIODIC);
    ui32Period = SysCtlClockGet() ;
    TimerLoadSet(TIMER0_BASE,TIMER_A,ui32Period-1);
    IntEnable(INT_TIMER0A_TM4C123);
    TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
    IntMasterEnable();

    TimerConfigure(TIMER1_BASE,TIMER_CFG_A_CAP_COUNT_UP |TIMER_CFG_SPLIT_PAIR);
    TimerControlEvent(TIMER1_BASE,TIMER_A,TIMER_EVENT_POS_EDGE);
/*    IntEnable(INT_TIMER1B_TM4C123);
    TimerIntEnable(TIMER0_BASE,TIMER_CAPA_EVENT);
    IntMasterEnable();*/

    TimerEnable(TIMER0_BASE,TIMER_A);
    TimerEnable(TIMER1_BASE,TIMER_A);

    while(1)
    {
        LCD_string_16x8(1,1,"The Freq is:");
        LCD_num_16x8(2,1,0,ui32Freq);
        LCD_string_16x8(3,1,"Hz");
        LCD_num_16x8(4,1,0,t);
        LCD_num_16x8(4,3,0,ui32Time[t]);
    }
}
void IntHandler()
{
    ui32Time[t] = TimerValueGet(TIMER1_BASE,TIMER_A);
    t++;
    if(t == 5)
    {
        ui32TD = ui32Time[4] - ui32Time[0];
        ui32Freq = ui32TD/5 ;
        t=0;
        ui32Time[0] = 0;
    }
    if(ui8State)
        ui8State = 0;
    else
        ui8State = 0x40;
    TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT);
//    SysCtlDelay(200000);
}

文中LCD的函数在头文件里。




最新回复

除了峰值保持和AD,电压测量不需要其它电路了。除非你电压测量也分几档。 AD芯片怎么用?那要看你选择什么型号的AD。   详情 回复 发表于 2014-7-31 19:04
 
点赞 关注

回复
举报

2万

帖子

0

TA的资源

超级版主

沙发
 
幅值测量,要求测峰值,但却不说频率范围。
不同频率范围的电压峰值测量,要求大不一样。
先别说程序,还是考虑硬件都需要什么电路吧。

点评

题目要求里面有说啊,频率在0.1HZ到64KHZ,幅值在0.1V到5V之间。 我就是不知道该怎么设计硬件电路,所以才觉着难的。不知道该用那些器件以及原理是什么样子的? 看了些峰值保持电路原理,感觉有点难度了吧? 为之  详情 回复 发表于 2014-7-31 09:07
 
 

回复

18

帖子

2

TA的资源

一粒金砂(中级)

板凳
 
maychang 发表于 2014-7-30 16:13
幅值测量,要求测峰值,但却不说频率范围。
不同频率范围的电压峰值测量,要求大不一样。
先别说程序,还 ...

题目要求里面有说啊,频率在0.1HZ到64KHZ,幅值在0.1V到5V之间。
我就是不知道该怎么设计硬件电路,所以才觉着难的。不知道该用那些器件以及原理是什么样子的?
看了些峰值保持电路原理,感觉有点难度了吧?
为之奈何??谢谢谢

点评

那么,题目里面就应该说“未知信号,频率在0.1Hz至64kHz之间,幅度在0.1V至5V之间,要求同时测量频率及幅度,并显示”。 峰值保持电路并不复杂,网上搜一搜,大把。 频率测量,不必AD,信号整型后,使用定时器即可  详情 回复 发表于 2014-7-31 11:45
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

4
 
amo_1 发表于 2014-7-31 09:07
题目要求里面有说啊,频率在0.1HZ到64KHZ,幅值在0.1V到5V之间。
我就是不知道该怎么设计硬件电路,所以 ...

那么,题目里面就应该说“未知信号,频率在0.1Hz至64kHz之间,幅度在0.1V至5V之间,要求同时测量频率及幅度,并显示”。
峰值保持电路并不复杂,网上搜一搜,大把。
频率测量,不必AD,信号整型后,使用定时器即可。不过,0.1Hz至64kHz这么大范围,最好分几档来测量。频率低时测周期,频率高时测频率(一定时间内的脉冲个数)。

点评

谢谢额。受教了。具体的电压幅值测量怎么办呢?出了峰值保持电路外还需要什么器件,如AD怎么用呢?  详情 回复 发表于 2014-7-31 15:40
 
 
 

回复

18

帖子

2

TA的资源

一粒金砂(中级)

5
 
maychang 发表于 2014-7-31 11:45
那么,题目里面就应该说“未知信号,频率在0.1Hz至64kHz之间,幅度在0.1V至5V之间,要求同时测量频率及幅 ...

谢谢额。受教了。具体的电压幅值测量怎么办呢?出了峰值保持电路外还需要什么器件,如AD怎么用呢?

点评

除了峰值保持和AD,电压测量不需要其它电路了。除非你电压测量也分几档。 AD芯片怎么用?那要看你选择什么型号的AD。  详情 回复 发表于 2014-7-31 19:04
 
 
 

回复

2万

帖子

0

TA的资源

超级版主

6
 
amo_1 发表于 2014-7-31 15:40
谢谢额。受教了。具体的电压幅值测量怎么办呢?出了峰值保持电路外还需要什么器件,如AD怎么用呢?

除了峰值保持和AD,电压测量不需要其它电路了。除非你电压测量也分几档。
AD芯片怎么用?那要看你选择什么型号的AD。

点评

恩,好。谢谢  详情 回复 发表于 2014-7-31 21:53
 
 
 

回复

18

帖子

2

TA的资源

一粒金砂(中级)

7
 
maychang 发表于 2014-7-31 19:04
除了峰值保持和AD,电压测量不需要其它电路了。除非你电压测量也分几档。
AD芯片怎么用?那要看你选择什 ...

恩,好。谢谢
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表