利用MSP430G2553测量信号幅度

发布者:blazings最新更新时间:2022-09-23 来源: csdn关键字:MSP430G2553  测量  信号幅度 手机看文章 扫描二维码
随时随地手机看文章

说明

P1.4引脚作为信号输入引脚

在变量窗口创建并查看fvpp的值即可

代码

该代码可以直接在CCS上编译运行


#include  

#include "stdint.h"


uint16_t adcbuff[50] = {0};

uint16_t maxval[50] = {0};

uint16_t minval[50] = {0};

uint16_t max = 0;

uint16_t min = 0;

uint16_t vpp = 0;


/*

 * @fn:     void InitSystemClock(void)

 * @brief:  初始化系统时钟

 * @para:   none

 * @return: none

 * @comment:初始化系统时钟

 */

void InitSystemClock(void)

{

    /*配置DCO为1MHz*/

    DCOCTL = CALDCO_1MHZ;

    BCSCTL1 = CALBC1_1MHZ;

    /*配置SMCLK的时钟源为DCO*/

    BCSCTL2 &= ~SELS;

    /*SMCLK的分频系数置为1*/

    BCSCTL2 &= ~(DIVS0 | DIVS1);

}

/*

 * @fn:     void InitUART(void)

 * @brief:  初始化串口,包括设置波特率,数据位,校验位等

 * @para:   none

 * @return: none

 * @comment:初始化串口

 */

void InitUART(void)

{

    /*复位USCI_Ax*/

    UCA0CTL1 |= UCSWRST;


    /*选择USCI_Ax为UART模式*/

    UCA0CTL0 &= ~UCSYNC;


    /*配置UART时钟源为SMCLK*/

    UCA0CTL1 |= UCSSEL1;


    /*配置波特率为9600@1MHz*/

    UCA0BR0 = 0x68;

    UCA0BR1 = 0x00;

    UCA0MCTL = 1 << 1;

    /*使能端口复用*/

    P1SEL |= BIT1 + BIT2;

    P1SEL2 |= BIT1 + BIT2;

    /*清除复位位,使能UART*/

    UCA0CTL1 &= ~UCSWRST;

}

/*

 * @fn:     void UARTSendString(uint8_t *pbuff,uint8_t num)

 * @brief:  通过串口发送字符串

 * @para:   pbuff:指向要发送字符串的指针

 *          num:要发送的字符个数

 * @return: none

 * @comment:通过串口发送字符串

 */

void UARTSendString(uint8_t *pbuff,uint8_t num)

{

    uint8_t cnt = 0;

    for(cnt = 0;cnt < num;cnt ++)

    {

        while(UCA0STAT & UCBUSY);

        UCA0TXBUF = *(pbuff + cnt);

    }

}

/*

 * @fn:     void PrintNumber(uint16_t num)

 * @brief:  通过串口发送数字

 * @para:   num:变量

 * @return: none

 * @comment:通过串口发送数字

 */

void PrintNumber(uint16_t num)

{

    uint8_t buff[6] = {0,0,0,0,0,'n'};

    uint8_t cnt = 0;

    for(cnt = 0;cnt < 5;cnt ++)

    {

        buff[4 - cnt] = (uint8_t)(num % 10 + '0');

        num /= 10;

    }

    UARTSendString(buff,6);

}

/*

 * @fn:     void PrintFloat(float num)

 * @brief:  通过串口发送浮点数

 * @para:   num:变量

 * @return: none

 * @comment:通过串口发送浮点数,可发送1位整数位+3位小数位

 */

void PrintFloat(float num)

{

    uint8_t charbuff[] = {0,'.',0,0,0};

    uint16_t temp = (uint16_t)(num * 1000);

    charbuff[0] = (uint8_t)(temp / 1000) + '0';

    charbuff[2] = (uint8_t)((temp % 1000) / 100) + '0';

    charbuff[3] = (uint8_t)((temp % 100) / 10) + '0';

    charbuff[4] = (uint8_t)(temp % 10) + '0';

    UARTSendString(charbuff,5);

}

/*

 * @fn:     void InitADC(void)

 * @brief:  初始化ADC

 * @para:   none

 * @return: none

 * @comment:初始化ADC

 */

void InitADC(void)

{

      /*设置ADC时钟MCLK*/

      ADC10CTL1 |= ADC10SSEL_2;

      /*ADC 2分频*/

      //ADC10CTL1 |= ADC10DIV_0;

      /*设置ADC基准源*/

      ADC10CTL0 |= SREF_1;

      /*设置ADC采样保持时间16CLK*/

      ADC10CTL0 |= ADC10SHT_2;

      /*设置ADC采样率200k*/

      ADC10CTL0 |= ADC10SR;

      /*ADC基准选择2.5V*/

      ADC10CTL0 |= REF2_5V;

      /*开启基准*/

      ADC10CTL0 |= REFON;

      /*选择ADC输入通道A4*/

      ADC10CTL1 |= INCH_4;

      /*允许A4模拟输入*/

      ADC10AE0 |= 1 << 4;


      /*DTC传输模式*/

      ADC10DTC0 |= ADC10CT;

      /*传输次数*/

      ADC10DTC1 = 50;

      /*起始地址*/

      ADC10SA = (uint16_t)(adcbuff);


      /*开启ADC*/

      ADC10CTL0 |= ADC10ON;


      /*允许转换*/

      ADC10CTL0 |= ENC;

}

/*

 * @fn:     uint16_t GetADCValue(void)

 * @brief:  进行一次ADC转换并返回ADC转换结果

 * @para:   none

 * @return: ADC转换结果

 * @comment:ADC转换结果为10bit,以uint16_t类型返回,低10位为有效数据

 */

uint16_t GetADCValue(void)

{

      /*开始转换*/

      ADC10CTL0 |= ADC10SC|ENC;

      /*等待转换完成*/

      while(ADC10CTL1&ADC10BUSY);

      /*返回结果*/

      return ADC10MEM;

}

/*

 * @fn:     void StartADCConvert(void)

 * @brief:  进行一次ADC转换

 * @para:   none

 * @return: none

 * @comment:ADC转换结果为10bit

 */

void StartADCConvert(void)

{

      /*开始转换*/

      ADC10CTL0 |= ADC10SC|ENC;

      /*等待转换完成*/

      while(ADC10CTL1&ADC10BUSY);

}

/*

 * @fn:     uint16_t Max(uint16_t *numptr,uint16_t num)

 * @brief:  查找最大值

 * @para:

 * @return: 最大值

 * @comment:

 */

uint16_t Max(uint16_t *numptr,uint16_t num)

{

    uint16_t cnt = 0;

    uint16_t max = 0;

    for(cnt = 0;cnt < num;cnt ++)

    {

        if(numptr[cnt] > max){

            max = numptr[cnt];

        }

    }

    return max;

}

/*

 * @fn:     uint16_t Min(uint16_t *numptr,uint16_t num)

 * @brief:  查找最小值

 * @para:

 * @return: 最小值

 * @comment:

 */

uint16_t Min(uint16_t *numptr,uint16_t num)

{

    uint16_t cnt = 0;

    uint16_t min = 0;

    min = numptr[0];

    for(cnt = 0;cnt < num;cnt ++)

    {

        if(numptr[cnt] < min){

            min = numptr[cnt];

        }

    }

    return min;

}

/*

 * @fn:     uint16_t Average(uint16_t *datptr)

 * @brief:  计算平均值

 * @para:   none

 * @return: none

 * @comment:

 */

uint16_t Average(uint16_t *datptr)

{

    uint32_t sum = 0;

    uint8_t cnt = 0;

    for(cnt = 0;cnt < 50;cnt ++)

    {

        sum += *(datptr + cnt);

    }

    return (uint16_t)(sum / 50);

}

/*

 * main.c

 */

int main(void)

{

    uint8_t cnt = 0,cnt1 = 0;

    volatile float fvpp = 0.0f;

    WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer

    InitSystemClock();

    InitUART();

    InitADC();


    while(1)

    {

        for(cnt1 = 0;cnt1 < 50;cnt1 ++)

        {

            for(cnt = 0;cnt < 50;cnt ++)

            {

                StartADCConvert();

            }

            maxval[cnt1] = Max(adcbuff,50);

            minval[cnt1] = Min(adcbuff,50);

        }

        max = Max(maxval,50);

        min = Min(minval,50);

        vpp = max - min;

        fvpp = (float)vpp * 2.5 / 1023;

        fvpp = fvpp;

        __delay_cycles(1000000);

    }

    return 0;

}


关键字:MSP430G2553  测量  信号幅度 引用地址:利用MSP430G2553测量信号幅度

上一篇:利用MSP430G2553测量信号频率(频率计)
下一篇:MSP430G2553 PWM控制速度,并自我检测和简单调节速度

推荐阅读最新更新时间:2024-11-12 16:24

LabVIEW中测试测量数据的存储(7)
终于写到TDMS了,千呼万唤始出来啊,其实所有前面的相关文章都是为了TDMS作铺垫。正是由于用户提出的种种需求以及其他种种文件格式的缺点,才有了TDMS的出现。 1. TDMS文件的逻辑格式 TDMS文件的逻辑格式遵循TDM三层结构,仍然是文件、通道组、通道三层。用户在使用时只需要关心这三层就行了。 2. TDMS文件API TDMS文件格式基本上可以称为NI用在测试测量领域的通用数据文件格式,LabVIEW, CVI/LabWindows, Signal Express, DIAdem中都可以使用,也常看到在Excel, MatLab被中调用。TDMS最核心的内容都在一个
[测试测量]
ASEMI的MOS管10N65如何测量好坏
为什么要检测mos管的好坏? 为了保护板上的其他元件,在将MOS管10N65连接到电路之前对其进行测试至关重要。mos管10N65主要有漏极、源极和栅极三个引脚。 当使用有故障的MOS管时,会发生漏极到栅极的短路,对电路不利。这种短路的结果可能是漏极电压反馈,这也会影响栅极端子。电压到达该端后,通过栅极电阻进一步传输到驱动电路,这种传输可能对驱动电路造成进一步的损坏。因此,在使用前检测mos管10N65的质量可以避免损坏整个电路。那么ASEMI的MOS管10N65如何测量好坏呢? 测量mos管10N65好坏时要注意的几点 在测试mos管时,您需要采取一些预防措施。主要是: 1、必须保证输入电源大于等于MOS管1
[测试测量]
ASEMI的MOS管10N65如何<font color='red'>测量</font>好坏
测量高频信号时千万别用鳄鱼地线
对于高频信号测量时,探头的鳄鱼接地线是万恶之源,无论多好的仪器都无法发挥价值,这是为什么呢? 1、高频晶振实测对比 我们先来感受一下,探头地线长与短其测量结果有何不同。 以晶振信号测量为例,如图1所示为常规的鳄鱼线接地测量方法,可看到信号过冲严重伴随振荡,和想像中的方波不一样。而图2所示的短地线弹簧接地测量方法,波形端正不少,显然资深工程师的方法没错。 图1 常规(鳄鱼线)测量方法(错误) 图2 短地(弹簧地)测量方法(正确) 2、核心区别:电感 种种迹象表明凶手就是“地线”那证据在哪呢? 且看图解,如图3所示为示波器使用探头进行信号测量理论上的等效模型。探头与示波器组成具有一定输入电阻和输入电容的测试
[单片机]
<font color='red'>测量</font>高频<font color='red'>信号</font>时千万别用鳄鱼地线
如何使用吉时利万用表DMM6500的比率功能测量功率
在TSP脚本和低电阻电流传感电阻器的帮助下,我们实现了一个有趣的应用,即使用DMM6500这样的数字万用表,通过比率功能测量功率。脚本基于的原理是,比率功能在一个读数中同时存储传感和输入电压的电压测量数据,然后显示输入电压与传感电压的比值。 比率功能比较输入端子上的电压与传感端子上的电压,输出它们的商,也就是输入电压除以传感电压。由于这一测量编码两个单独的电压读数,因此使用TSP脚本会有一些事情很好玩。 例如,在下面的应用中,比率功能在传感端子之间放一个外部低电阻并联电阻器,来测量功率。这意味着您可以使用传感端子和输入上的电压,来测量电流。有了这两个值,您可以计算给定电路任意一段的能耗。 但在此之前,您首先要解码比率测
[测试测量]
如何使用吉时利万用表DMM6500的比率功能<font color='red'>测量</font>功率
示波器测量交流分量电压的步骤方法
测量交流分量电压,应将输入“选择”开关放在“AC”位置,将被测信号上的直流分量隔开。否则,当直流分量电压的叠加超过偏转放大器的线性偏转范围时,得到的将是不准确的结果。但在测量重复频率极低的交流分量电压时,应将输入“选择”开关放到“DC”位置,否则将由于频率响应的限制,使所测电压的结果不真实。 测量方法可按以下步骤进行: (1)根据坐标中(单位厘米)读出从正峰降到负峰y轴偏转的距离。 (2)根据输入偏转因数“V/cm”旋钮所放的位置,用每厘米偏转电压值乘以峰峰间的y轴偏转距离。 (3)把以上乘得的数值再乘以所用探极的衰减因数,即得到实际的峰峰值电压。 例:设所用测试探极为1: 10衰减探极,偏转放大器的输入偏转因数“V/cm”旋
[测试测量]
示波器测量汽车爆震传感器及波形分析
爆震是发动机燃烧室中末端混合气自燃所造成的一种不正常燃烧现象。爆震不但会产生尖锐的敲缸声,还会使活塞、连杆、曲轴等机械部件受到过度的冲击,造成机械损坏,并导致发动机过热,从而大大缩短发动机工作寿命,因此发动机的爆震需要加以控制。目前最广泛使用的是用爆震传感器检测发动机振动的方法来判断有无爆震。 爆震传感器有共振型和非共振型两大类,共振型又分为磁致伸缩式和压电式两种,非共振型只有压电式。由于共振型传感器在发动机爆震时输出的电压比较高,因此无需使用滤波器即可判别有无爆震产生;而非共振型的爆震传感器需经滤波器检测出爆震的信号。现代绝大多数汽车采用共振型压电式爆震传感器,它是利用发动机产生爆震时,其振动频率和传感器本身的固有频率一致而
[测试测量]
示波器<font color='red'>测量</font>汽车爆震传感器及波形分析
用三坐标如何测量工件
三坐标是一种精密的测量仪器,可以对所有工件尺寸及几何位置尺寸,曲面进行测量。由于测量过程复杂,用三坐标如何测量工件并不是轻易可以掌握的,下面简单给大家介绍一下用三坐标如何测量工件: 一、测量前准备: 1、空压气管是否接好。 2、电源是否按规定电压联接妥当。 二、测量步骤: 1、首先将空压气管开关打开,待气压正常后,才能移动三轴(X、Y、Z轴)。 2、电脑系统电源打开,进入WINDOWS之三次元测量程序。 3、依操作顺序及相关测量方法进行测量。 三轴归零→测头直径测量→原点设定→基准面设定→基准轴设定→工件尺寸测量 4、测量完毕,将三轴之立轴(Z轴)放置于操作者的左前方,并关闭电脑系统及空压气管开关 三、注意事项
[测试测量]
精密铸造的温度测量控制
成功的精密铸造厂家知道工艺过程控制对于生产优质铸件的重要性。铸造工艺中的关键变量包括铸模温度、铸模的隔热特性、周期时间和操作人员的方法等,但是,其中最关键的工艺变量是金属温度。在精密铸造工艺中,金属温度的非接触测量有着许多重大困难,但是,最近开发出来的一套装置可提供实时精度的量化反馈,揭示出了潜在问题。 温度的重要性 在精密铸造工艺中,特别是在“等轴”工艺中,金属温度是起支配作用的因素,因此,也对许多质量特性有着直接的影响。如果测量和控制不当,金属温度的差异会对成品铸件尺寸、晶粒尺寸、疏松(表面和内部)、机械性能、产品品质(即热撕裂的倾向性 )、薄壁部分的充满度等方面产生影响。 因此,改进金属温度的测量和控制将会提高质量和生产
[测试测量]
精密铸造的温度<font color='red'>测量</font>控制
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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