This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FG4618:MSP430FG4618频率计

Guru**** 1079480 points
Other Parts Discussed in Thread: MSP430FG4618
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/677689/msp430fg4618-msp430fg4618-frequency-meter

器件型号:MSP430FG4618

您好!

我想了解该固件、以了解测量频率采集的工作原理。

可以有人帮助我吗?

如何查看 P1.5引脚输入端的测量频率?

此致、

请单击包含源代码的链接:

e2e.ti.com/.../33855

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您能否澄清一下您正在具体讨论的链接中的代码?

    "在 P1.5引脚的输入端测量的频率"到底是什么意思? 您只是想查看该引脚的输入吗?

    此致、
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nathan、

    我需要在任何变量中测量每个脉冲的流量计中的脉冲频率、并通过串行 RS232发送。

    我想使用脉冲捕获模式并测量一个脉冲和另一个脉冲之间的周期来计算测量的体积。

    我已经为 MSP430、尤其是我正在使用的 MSP430FG4618寻找了几天的这方面的示例。 我找到了其他 MSP430系列的一些示例、但我遇到了更改与 MSP430FG4618略有不同的寄存器的困难。

    我不知道如何根据仪表产生的脉冲来测量流量。

    我发现这个主题涉及频率测量。

    感谢您的反馈。

    Anderson。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Anderson:

    我不相信您链接到的帖子中的代码正是您所期望的。 它实际上并不测量流速。 您还提到哪些其他代码示例?

    此致、
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    通常、您设置两个计数器、一个计数输入信号、另一个计数已知频率。 其中一个计数器将选通另一个计数器。

    链接到的代码具有其中的一些元素、但其中包含一些奇怪的元素、但缺少其他元素。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好

    我正在使用端口1 p1.0中断引脚来对流脉冲进行计数。

    在基本计时器 BT (temp ++;)生成5秒后、我执行流量测量:

    Q =脉冲/计时器。

    浮点流量=(仪表的底部刻度 x 脉冲 x 3600 x 1000)/温度;

    3600 x 1000、单位为 m3/h

    例如: 计算得出的10.15 Hz 等于36.353 m3/h。

    我的代码:10.15 Hz 等于 25.456 m3/h、精确测量时不会振荡。

    我意识到、由于使用 XTAL1 32.768kHz 晶体、它非常缓慢且不准确。

    也许 XTAL2由于频率更快,我可以获得更好的结果,但我尝试通过 slac118l.zip 示例进行配置,无法使其正常工作。。。 我想我不知道如何正确配置。

    我还在想对74HC590输入端的脉冲进行计数,并使用计时器 A 来精确计时... 我认为毫秒或微秒会得到更好的结果。

    同事必须告诉我什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Danny F 的解决方案最适合快速信号、因为您不必处理单个脉冲。

    我熟悉的流量计非常慢(10-100Hz)。 对于那些您可能更喜欢输入捕捉的人,因为您不需要猜测检查频率--脉冲决定了您的输出延迟。 您还可以设置单独的 CCR 来检测超时(0Hz)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果频率这么低、我将使用自由运行的定时器和边沿的时间戳。 利用两个边沿之间的时间差、您可以知道流速。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我能够汇编此代码、但我没有得到结果等待! 例如:计算出的频率与示波器上显示的频率不同、其中生成的频率为10Hz、测量频率为20Hz。  

    生成的频率为16.6Hz、测量频率为513Hz!

    我有没有做错了?

    我还想知道在捕获模式中是否正确设置了计时器?

    是否可以在 LPM3模式下工作?



    #include #include #include #include #include volatile unsigned int count、Edge1、period;//全局变量 float freq; unsigned char string_freq[10]; volatile unsigned int i; //定义- tostar flag de TX da USCI 0 e usci1 */ #define tosta_TX_CR () while (!(IFG2 & UTXIFG1))); // // // Definições e Inicialização da Comunicação Serial RS232 DO Data Logger //// ********* // void initRS232 (void) { P4SEL |= 0x03; // P4.1、0 = USART1 TXD/RXD ME2 |= UTXE1 + URXE1; //启用 USART1 TXD/RXD U1CTL |=字符; // 8位字符 U1TCTL |= SSEL0; // UCLK = ACLK U1BR0 = 0x03; // 32k/9600 - 3.41 U1BR1 = 0x00; // U1MCTL = 0x4A; //调制 U1CTL &=~SWRST; //初始化 USART 状态机 IE2 |= URXIE1; //启用 USART1 RX 中断 } //********* // // Rotina para Transmissão Serial DO Data Logger //// ********* // void msg_rs232_cr (unsigned char *字符串) //通过 UCA0通过 RS232通过 UMA 字符串 ,而(*字符串!= 0) { Testa_TX_CR ();// tista 标志 de TX TXBUF1 =*字符串; *string++; }// while string } void main (void) { WDTCTL = WDTPW + WDTHOLD;//停止看门狗计时器 FLL_CTL0 |= XCAP14PF; //配置负载电容 //等待 xtal 以稳定 执行 { IFG1 &=~OFIFG; //清除 OSCFault 标志 对于(I = 0x47FF;I > 0;I-); //标志置位 } while ((IFG1 & OFIFG)的时间; // OSCFault 标志仍然置1? P1DIR &=~BIT2;//设置 P1.2 ->输入 P1SEL |= BIT2;//设置 P1.2 -> TA0.1捕获模式 //P1DIR &=~BIT0;//设置 P1.0 ->输入 //P1SEL |= BIT0;//设置 P1.0 -> TA0捕获模式 MSP430FG4618 initrs232(); //初始化 o RS232 TA0CCTL1 = CAP + CM_1 + CCIE + SCS + CCIS_0;//捕获模式、上升沿、中断 //启用、同步、源-> CCI0A //TACTL = tassel_1 + MC_2 + TAIE + TACLR; // ACLK、续 模式、 TA0CTL |= TASSEL_2 + MC_2 + TACLR;//时钟-> SMCLK、续 模式、清除计时 器 while (1) { 计数= 0;//初始化新捕捉的计数 _bis_SR_register (LPM0_bits + GIE);//输入 LPM0、启用中断 //在捕获到2个上升沿后退出 LPM0 如果(Edge2 > Edge1)//发生溢出时忽略计算 { 句点= Edge2 - Edge1;//计算周期 频率= 1000000L/周期; //计算频率 MSG_RS232_CR ("频率:"); //对串频率进行瞬态处理 sprintf (string_freq、"%.2f"、freq); MSG_RS232_CR (string_freq); MSG_RS232_CR ("\r\n"); } __no_operation();//用于在调试器 中插入断点} // Timer_A3中断矢量(TAIV)处理程序 #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__) #pragma vector=TIMERA1_vector __interrupt void Timer_A (void) #Elif Defined (__GNC_systems_icon_)#pragma COMPIENTICTOR (void)(void)(void TI_RA1_)(void)(void)(void)(void)(void TI_timer_A)(void)(void) #endif { switch (TAIV) { 案例2:if (!count)//检查计数值 { Edge1 = TA0CCR1; //存储第一个边沿的定时器值 count++;//递增计数 } 其他 { Edge2 = TA0CCR1; //存储第二个边沿的定时器值 计数= 0;//重置计数 __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE);//返回 main 时退出 LPM0 } 中断; //使用 TACCR1 案例4:中断; //未使用 TACCR2 案例10:中断; //溢出 } // #pragma vector = TIMER0_A1_vector __interrupt void TIMER0_A1_ISR (void) { switch (__even_in_range (TA0IV、0x0A) ){ case TA0IV_none:break;//向量0:无中断 情况 TA0IV_TACCR1://向量2:TACCR1 CCIFG if (!count)//检查 count 的值 { Edge1 = TA0CCR1;//存储第一个边沿的定时器值 count ++;//递增 count } 其他 { Edge2 = TA0CCR1;//存储第二个边沿的定时器值 计数= 0;//重置计数 __BIC_SR_REGISTER_ON_EXIT (LPM0_Bits + GIE);//返回 main 时退出 LPM0 } break; case TA0IV_TACCR2:break;//向量4:TACCR2 CCIFG case TA0IV_6:break;//向量6:保留 CCIFG 大小写 TA0IV_8:break;//向量8:保留 CCIFG 大小写 TA0IV_TAIFG:break;//向量10:TAIFG 默认值:break; } } */

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    易于调试。 问问自己代码是如何工作的以及您的期望是什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    低于大约1MHz/65536 =~15Hz 时、定时器将在脉冲之间换行。 例如、考虑使用 ID=3 (1MHz/8=125kHz 时的定时器)。

    您还可以设置单独的 CCR 来检测超时(0Hz)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢大家! 但我不熟悉 MSP430、遇到了一些困难。

    先生们可以开始这种配置吗?

    您能否发布代码片段或示例代码?

    我必须测量0.1Hz 至100Hz 的频率!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想您已经走上了正确的轨道、您只需了解您的计时器实际测量的内容:计时器计时、计时器计时周期的长度取决于计时器的输入时钟。 1/时间=频率

    测量0.1Hz 将是一个挑战,因为无论你怎么做,你都需要等待10秒钟才能找到答案。 它是多少 L/m?

    您可能需要为计时器提供不同的时钟源、因为1MHz 对于您正在执行的操作来说速度相当快。 使用 ID 位[另请参见 SLAU056L 秒 15.2.1]您可以将时钟除以高达/8 (ID_3)。 1MHz/8=125kHz、/65536大约为0.5秒(包装前)、因此下限大约为2Hz。

    如果 ACLK 上有32kHz 晶振(MSP-EXP430F4618有一个[SLAU213A 秒 6.4.2])您可以将其用于计时器(tassel_1)。 除以/8即可得到4096Hz。 对于100Hz (10ms)、这大约是40个周期。 16位绕回将在4096/65536 = 0.0625Hz (16秒)时发生。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Bruce 的支持!

    是的、我需要测量刻度为0.001 m3/h 的脉冲式水表的流量

    我在互联网上找到了这个代码示例、并选择对其进行测试、发现测得的最低频率为200Hz。

    您能否按所说的那样进行配置?



    /********* //* 实验4C -频率测量 */ * */ * */ * */ /* MSP430教学 ROM // //*由以下公司生产:MSP430@UBI Group - www.msp430.ubi.pt */ * */ /*练习:使用 MSP-EXP430FG4618开发工具和*/ //* MSP430FG4618器件、执行频率测量 */ * */ /*说明: */ * */ *完成以下代码: */ *-配置基本定时器1 */ *-配置 Timer_A */ *-配置 Timer_B // /*-配置 P1、P2和 P3 */ * */ * */ * */ * 德州仪器2009版权所有 */ ********* /#include #include "lcd_defs.h" //******** //全球数据 //********* unsigned char 标志、捕获、计数器、tick; unsigned int T、 T1、T2、freq; //********* // LCD 中的写入频率(Hz) //******** void lcd_freq (void) { unsigned int freq1、freq2、freq3、freq4; 频率= 7995392/T; freq1 = freq/1000; freq2 = freq % 1000; switch (freq1)//切换到写入频率第一位 { case 1:P4_A1; 中断; 案例2:P4_A2; 中断; 案例3:P4_A3; 中断; 案例4:P4_A4; 中断; 案例5:P4_A5; 中断; 案例6:P4_A6; 中断; 案例7:P4_A7; 中断; 案例8:P4_A8; 中断; 案例9:P4_A9; 中断; 案例0:P4_A0; break; } freq3 = freq2 % 100; freq2 = freq2 / 100; 开关(freq2)//切换到写入秒频率数字 { 案例1:P3_A1; 中断; 案例2:P3_A2; 中断; 案例3:P3_A3; 中断; 案例4:P3_A4; 中断; 案例5:P3_A5; 中断; 案例6:P3_A6; 中断; 案例7:P3_A7; 中断; 案例8:P3_A8; 中断; 案例9:P3_A9; 中断; 情况0:P3_A0; } freq4 = freq3 % 10; freq3 = freq3 / 10; 开关(freq3)//切换到写入秒频率数字 { 案例1:P2_A1; 中断; 案例2:P2_A2; 中断; 案例3:P2_A3; 中断; 案例4:P2_A4; 中断; 案例5:P2_A5; 中断; 案例6:P2_A6; 中断; 案例7:P2_A7; 中断; 案例8:P2_A8; 中断; 案例9:P2_A9; break; case 0:P2_A0; } switch (freq4)//切换到写入秒频率数字 { 案例1:P1_A1; 中断; 案例2:P1_A2; 中断; 案例3:P1_A3; 中断; 案例4:P1_A4; 中断; 案例5:P1_A5; 中断; 案例6:P1_A6; 中断; 案例7:P1_A7; 中断; 案例8:P1_A8; 中断; 案例9:P1_A9; 中断; 案例0:P1_A0; } } //******** //液晶屏清洁例程 //******** void LCD_all_off (void) { LCDM2 = 0x00; LCDM3 = 0x00; LCDM4 = 0x00; LCDM5 = 0x00; LCDM6 = 0x00; LCDM7 = 0x00; LCDM8 = 0x00; LCDM9 = 0x00; LCDM10 = 0x00; LCDM11 = 0x00; LCDM12 = 0x00; LCDM13 = 0x00; } //********* // Timer A 中断服务例程 //********* #pragma vector=TIMERRA1_Vector __INTERRUPT void TimerA1_ISR (void) { switch (TAIV) { case TAIV_TACCR1: if (capture ==0){ T1 = TACCR1; FLAG = 1; 捕捉= 1; } 否则{ 如果(flag = 1){ T2 = TACCR1; 如果(T2 > T1) T = T2-T1; } 否则{ tar = 0; } 捕捉= 0; 标志= 0; } 中断; 案例 TAIV_TACCR2: 中断; 案例 TAIV_TAIFG: tick++; 如果(tick ==60){ lcd_freq(); 节拍= 0; } 如果(flag = 1) flag = 0; 中断; 默认值: 中断; } // ********* //基本定时器中断服务例程。 以1秒的周期运行 //********* #pragma vector=BASICTIMER_VECTOR __INTERRUPT void basic_timer_ISR (void) { unsigned int read_data; //从文件中读取数据,频率以 kHz 为单位 P2OUT^= 0x06;//将 LED1和 LED2 COUNTER++进行齿形操作; if (counter == 5){ 计数器= 0; READ_DATA = 200; TBCCR0 = 7995392/READ_DATA; TBCCR4 = TBCCR0/2; } // //主例程 //********* void main (void) { //停止看门狗 WDTCTL = WDTPW | WDTHOLD; //停止 WDT // FLL+配置// ACLK - 32.768kHz FLL_CTL0 |= DCOPLUS + XCAP18PF; // DCO+ set、freq = xtal x D x N+1 SCFI0 |= FN_4; // x2 DCO 频率、8MHz 标称 DCO SCFQCTL = 121; //(121+1) x 32768 x 2 = 7.99MHz //端口 COM0-COM1-COMM2-COM3配置 P5DIR |= 0x1E; //端口 P5.2、P5.3和 P5.4作为输出 P5SEL |= 0x1E; //端口 P5.2、P5.3和 P5.4作为特殊功能(COM1、COM2和 COM3) // S0-S21端口配置 LCDAPCTL0 = LCDS24 | LCDS20 | LCDS16 | LCDS12 | LCDS8 | LCDS4; // LCDA 配置 LCDACTL = LFREQ_192 | LCDMUX | LCD4SON //(ACLK = 32768)/192、4路复用 LCD、LCD_A 打开、 LCDAVCTL0 = LCDCPEN 上的段; //电荷泵使能 LCDAVCTL1 = VLCD_3_44; // VLCD = 3.44V LCD_All_OFF (); //基本定时器1配置 BTCTL = BTDIV | BT_fCLK2_DIV128; //(ACLK/256)/128 IE2 |= BTIE; //启用周期为1秒的 BT 中断 // TimerB 配置 TBCCR0 = 39977;//输出200Hz 信号,50%占空比 TBR = 0;//复位 TBR TBCCTL4 = OUTMOD_3; // CCR4输出模式3 (置位/复位) TBCCR4 = TBCCR0/2; TBCTL = TBSSEL_2 | CNTL_0 | TBCLGRP_0 |MC_1 | ID_0; // SMCLK、连续模式 // TimerA 配置 TACTL = tassel_2 |MC_2 | ID_0 | TAIE;// SMCLK、连续模式高达0xFFFF TACCTL1 = CM1 | CCIS_0 | CAP | CCIE; //上升沿上的捕捉、电容模式、CAP/Com 中断使能 //选择 TACCR1输入信号 // TA1 (TACCR1)配置(端口1) P1SEL = 0x04; // P1.2作为特殊功能(TA1) P1DIR = 0x00; // P1.2作为输入 // LED1和 LED2配置(端口2) P2DIR = 0x06; // P2.2和 P2.1作为数字输出 P2OUT = 0x04; // LED1导通且 LED2关断 // TB4配置(端口3) P3SEL = 0x20; // P3.5作为特殊功能(TB4) P3DIR = 0x20; // P3.5作为输出 //全局数据初始 化计数器= 0; tick = 0; //启用中断 //_BIS_SR (GIE); //所有中断使能 __bis_SR_register (LPM0_bits + GIE);//输入具有中断使能 的低功耗模式0 (;); } //********* // Lab3d_solution .c 结束 //*********

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想我已经解释过(两次、包括参考)如何修复或至少改进您正在做的事情。 现在我想你需要做你自己的家庭作业。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Bruce 的建议!

    这是一个测量1Hz 频率的代码。

    现在、我需要更好地评估如何测量小于1Hz 的频率。

    感谢大家的耐心!




    #include #include #include #include #include #include #include #include "LCD16x2_Data_Logger.c" volatile int Temporizador = 0; unsigned char string_vazao[10]; unsigned char flag、capture、counter、 tick; unsigned int T、t1、t2; float freq = 0.0; float vazao = 0.0; //*************** // // Definições dos Pinos de Entrada e Saída Do MSP430 Do Data Logger //// ********* // void initPORTS (void) { P1OUT = 0; //所有 P1.x 复位 P1DIR = 0xFF; //所有 P1.x 输出 P2OUT = 0; //所有 P2.x 复位 P2DIR = 0xFF; //所有 P2.x 输出 P3OUT = 0; //所有 P3.x 复位 P3DIR = 0xFF; //所有 P3.x 输出 P4OUT = 0; //所有 P4.x 复位 P4DIR = 0xFF; //所有 P4.x 输出 P5OUT = 0; //所有 P5.x 复位 P5DIR = 0xFF; //所有 P5.x 输出 P6OUT = 0; //所有 P6.x 复位 P6DIR = 0xFF; //所有 P6.x 输出 P7OUT = 0; //所有 P7.x 复位 P7DIR = 0xFF; //所有 P7.x 输出 P8OUT = 0; //所有 P8.x 复位 P8DIR = 0xFF; //所有 P8.x 输出 P9OUT = 0; //所有 P9.x 复位 P9DIR = 0xFF; //所有 P9.x 输出 P10OUT = 0; //所有 P10.x 复位 P10DIR = 0xFF; //所有 P10.x 输出 // TA1 (TACCR1)配置(端口1) P1SEL = 0x04; // P1.2作为特殊功能(TA1) P1DIR = 0x00; // P1.2作为输入 // LED1和 LED2配置(Port2) P2DIR = 0x07; // P2.2和 P2.1作为数字输出 P2OUT &=~ 0x04; // LED1导通,LED2关断 P5DIR = 0x02; //定义 P5.1 como Saída P5OUT &=~ 0x02; // Zera o Pino LED4 P5OUT =!(BIT1); // Tensão 降级 a Conversão de 升压// ********* // // Definições e Inicialização da Comunicação Serial RS232 DO Data Logger //// ********* // void initRS232 (void) { P4SEL |= 0x03; // P4.1、0 = USART1 TXD/RXD ME2 |= UTXE1 + URXE1; //启用 USART1 TXD/RXD U1CTL |=字符; // 8位字符 U1TCTL |= SSEL0; // UCLK = ACLK U1BR0 = 0x03; // 32k/9600 - 3.41 U1BR1 = 0x00; // U1MCTL = 0x4A; //调制 U1CTL &=~SWRST; //初始化 USART 状态机 IE2 |= URXIE1; //启用 USART1 RX 中断 } //********* // // Definições e Inicialização do basic timer para Temporizações do Data Logger //// ********* // void initBT (void) { BTTCNT1 = BTTCNT2 = 0; BTTCTL = BTDIV + BT_fCLK2_DIV128;// Configura o Basic Timer IE2 |= BTIE;// Habilita o Basic Timer } //********* // // Rotina para Transmissão Serial DO Data Logger //// ********* // void msg_rs232_cr (unsigned char *字符串) //通过 UCA0通过 RS232通过 UMA 字符串 ,而(*字符串!= 0) { Testa_TX_CR ();// tista 标志 de TX TXBUF1 =*字符串; *STRING++; }// while string } //********* // Rotina de Conversão dos Dados do Canal de Pressão Manom é trica para Apresentação no Display LCD 16X4 do Data Logger // // void Mostra_Vazao (float Vazao) { sprintf (string_vazao、"%.2f"、Vazao); LCDSetPosition (0、1); LCDPrintString ("频率计"); LCDSetPo1、2 (1); LCDPrintString (":"); // Escreve Q: LCDSetPosition (1、6); // Posiciona para escrita do Valor de Vazão 无 LCD16x2 LCDPrintString (string_vazao); // Asesa o Valor da Vazão 无 LCD16x2 LCDSetPosition (1、13); // Posiciona para escria da Unidade de Vazão 无 LCD16x2 LCDPrintString ("Hz"); // Escreve a Unidade de Vazão no LCD16x2 } // // LCD 中的写入频率(Hz) //******** void lcd_freq (void) { freq = 32768L/(float) T; } void main (void) { volatile unsigned int j; WDTCTL = WDTPW + WDTHOLD; //停止 WDT //时钟默认值:MCLK = 32 x ACLK = 1MHz,FLL+操作 FLL_CTL0 |= XCAP14PF; //配置负载电容器 执行 { IFG1 &=~OFIFG; //清除 OSCFault 标志 对于(j = 0x47FF;j > 0;j-); //标志置位 } while ((IFG1 & OFIFG)的时间; // OSCFault 标志仍然置1? initPORTS();//初始化操作系统端口 initBT();//初始化 o BT initRS23();//初始化 o RS232 P5OUT &=~ 0x02;// Habitabila o MAX761CPA para Conversão de Tensão InitLCD (); LCDPrintString ("Testando..."); __delay_cycles (50000); LCDSetPosition (1、0); LCDPrintString ("Display LCD16X2"); __DELAY_CYCLLES (50000); LCDClear (); // TimerA 配置 TACTL = tassel_1 |MC_2 | ID_0 | TAIE;// SMCLK、持续模式高达0xFFFF TACCTL1 = CM1 | CCIS_0 | CAP | CCIE; //上升沿上的捕捉、电容模式、CAP/Com 中断使能 //选择 TACCR1输入信号 执行// Rotina Principal { _bis_SR_register (LPM3_bits + GIE);// Entra em LPM3 (Mdo de Baixo Consumo) _NO_OPERATION ();// Não FAZ nada } while (1);// Enquantto adjustment for < Que 38、garante o LPM3 __bis_SR_register (LPM3_bits + GIE);// Entra em LPM3 (Modo de Baixo Consumo) } //--------------- //基本定时器的中断服务例程:在 CCI2B 上开始捕获 //自动清除标志 //--------------- #pragma vector = BASICTIMER_Vector __interrupt void BASICTIMER_ISR (void) { // Temporizador++; if (Temporizador == 5) { Temporizador = 0; // Reseta Temporizador vazao =(freq * 0.001 * 3600); //转换 A Vazão Mostra Vazao (vazao); // Apresa a Vazão } */ Motra_Vazao (freq); // Apresa a Vazão } //******** // Timer A 中断服务例程 //********* #pragma vector=TIMERRA1_Vector __INTERRUPT void TimerA1_ISR (void) { switch (TAIV) { case TAIV_TACCR1: 如果(CAPTURE ==0) { T1 = TACCR1; FLAG = 1; 捕捉= 1; } 其他 { 如果(标志= 1) { T2 = TACCR1; 如果(T2 > T1) T = T2-T1; lcd_freq(); } 其他 { tar = 0; } 捕捉= 0; 标志= 0; } 中断; 案例 TAIV_TACCR2: break; 案例 TAIV_TAIFG: tick++; 如果(节拍== 60) { lcd_freq(); 节拍= 0; } 如果(标志= 1) 标志= 0; 中断; 默认值: 中断; } }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Bruce!
    
    您的说明对我的学习非常重要!
    
    代码按我喜欢的方式运行!
    
    此致
    
    、#include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include "LCD16x2_Data_Logger.c"
    
    volatile int Temporizador = 0;
    unsigned char string_freq[10];
    unsigned char flag、capture、counter、 tick;
    unsigned int T、t1、t2;
    float freq = 0.0;
    //************* //
    // Definições dos Pinos de Entrada e Saída Do MSP430 Do Data Logger ////
    ********* //
    void initPORTS (void)
    {
    P1OUT = 0; //所有 P1.x 复位
    P1DIR = 0xFF; //所有 P1.x 输出
    P2OUT = 0; //所有 P2.x 复位
    P2DIR = 0xFF; //所有 P2.x 输出
    P3OUT = 0; //所有 P3.x 复位
    P3DIR = 0xFF; //所有 P3.x 输出
    P4OUT = 0; //所有 P4.x 复位
    P4DIR = 0xFF; //所有 P4.x 输出
    P5OUT = 0; //所有 P5.x 复位
    P5DIR = 0xFF; //所有 P5.x 输出
    P6OUT = 0; //所有 P6.x 复位
    P6DIR = 0xFF; //所有 P6.x 输出
    P7OUT = 0; //所有 P7.x 复位
    P7DIR = 0xFF; //所有 P7.x 输出
    P8OUT = 0; //所有 P8.x 复位
    P8DIR = 0xFF; //所有 P8.x 输出
    P9OUT = 0; //所有 P9.x 复位
    P9DIR = 0xFF; //所有 P9.x 输出
    P10OUT = 0; //所有 P10.x 复位
    P10DIR = 0xFF; //所有 P10.x 输出
    
    // TA1 (TACCR1)配置(端口1)
    P1SEL = 0x04; // P1.2作为特殊功能(TA1)
    P1DIR = 0x00; // P1.2作为输入
    
    // LED1和 LED2配置(Port2)
    P2DIR = 0x07; // P2.2和 P2.1作为数字输出
    P2OUT &=~ 0x04; // LED1导通,LED2关断
    
    P5DIR = 0x02; //定义 P5.1 como Saída
    P5OUT &=~ 0x02; // Zera o Pino LED4
    P5OUT =!(BIT1); // Tensão 降级 a Conversão de
    升压//
    ********* //
    // Definições e Inicialização da Comunicação Serial RS232 DO Data Logger ////
    ********* //
    void initRS232 (void)
    {
    P4SEL |= 0x03; // P4.1、0 = USART1 TXD/RXD
    ME2 |= UTXE1 + URXE1; //启用 USART1 TXD/RXD
    U1CTL |=字符; // 8位字符
    U1TCTL |= SSEL0; // UCLK = ACLK
    U1BR0 = 0x03; // 32k/9600 - 3.41
    U1BR1 = 0x00; //
    U1MCTL = 0x4A; //调制
    U1CTL &=~SWRST; //初始化 USART 状态机
    IE2 |= URXIE1; //启用 USART1 RX 中断
    }
    //********* //
    // Definições e Inicialização do basic timer para Temporizações do Data Logger ////
    ********* //
    void initBT (void)
    {
    BTTCNT1 = BTTCNT2 = 0;
    BTTCTL = BTDIV + BT_fCLK2_DIV128;// Configura o Basic Timer
    IE2 |= BTIE;// Habilita o Basic Timer
    }
    //********* //
    // Rotina para Transmissão Serial DO Data Logger ////
    ********* //
    void msg_rs232_cr (unsigned char *字符串)
    //通过 UCA0通过 RS232通过 UMA 字符串
    ,而(*字符串!= 0)
    {
    Testa_TX_CR ();// tista 标志 de TX
    TXBUF1 =*字符串;
    *STRING++;
    }// while string
    }
    //********* //
    Rotina de Conversão dos Dados do Canal de Pressão Manom é trica para Apresentação no Display LCD 16X4 do Data Logger
    // //
    void Mostra_freq (float Freq)
    {
    sprintf (string_freq、"%.2f"、Freq);
    LCDSetPosition (0、2);
    LCDPrintString ("频率计");
    LCDSetPosition (1、2);
    LCDPrintString (" F:");
    LCDSetPosition (1、6);
    LCDPrintString (string_freq);
    LCDSetPosition (1、13);
    LCDPrintString ("Hz");
    }
    //
    // LCD 中的写入频率(Hz)
    //********
    void lcd_freq (void)
    {
    freq = 4096L/(float) T;
    }
    
    void main (void)
    {
    volatile unsigned int j;
    
    WDTCTL = WDTPW + WDTHOLD; //停止 WDT
    //时钟默认值:MCLK = 32 x ACLK = 1MHz,FLL+操作
    FLL_CTL0 |= XCAP14PF; //配置负载电容器
    
    执行
    {
    IFG1 &=~OFIFG; //清除 OSCFault 标志
    对于(j = 0x47FF;j > 0;j-); //标志置位
    }
    while ((IFG1 & OFIFG)的时间; // OSCFault 标志仍然置1?
    
    initPORTS();//初始化操作系统端口
    initBT();//初始化 o BT
    initRS23();//初始化 o RS232
    
    P5OUT &=~ 0x02;// Habitabila o MAX761CPA para Conversão de Tensão
    InitLCD ();
    LCDPrintString ("Testando...");
    __delay_cycles (50000);
    LCDSetPosition (1、0);
    LCDPrintString ("Display LCD16X2");
    __DELAY_CYCLLES (50000);
    LCDClear ();
    
    // TimerA 配置
    TACTL = tassel_1 |MC_2 | ID_3 | TAIE;// SMCLK、持续模式高达0xFFFF
    TACCTL1 = CM1 | CCIS_0 | CAP | CCIE; //上升沿上的捕捉、电容模式、CAP/Com 中断使能
    //选择 TACCR1输入信号
    
    执行// Rotina Principal
    {
    _bis_SR_register (LPM3_bits + GIE);// Entra em LPM3 (Mdo de Baixo Consumo)
    _NO_OPERATION ();// Não FAZ nada
    }
    while (1);// Enquantto adjustment for < Que 38、garante o LPM3
    
    __bis_SR_register (LPM3_bits + GIE);// Entra em LPM3 (Modo de Baixo Consumo)
    }
    //---------------
    //基本定时器的中断服务例程:在 CCI2B 上开始捕获
    //自动清除标志
    //---------------
    #pragma vector = BASICTIMER_Vector
    __interrupt void BASICTIMER_ISR (void)
    {
    MOISRA_Freq (freq); // Apresa a Vazão
    }
    //********
    // Timer A 中断服务例程
    //*********
    #pragma vector=TIMERRA1_Vector
    __INTERRUPT void TimerA1_ISR (void)
    {
    switch (TAIV)
    {
    case TAIV_TACCR1:
    如果(CAPTURE ==0)
    {
    T1 = TACCR1;
    FLAG = 1;
    捕捉= 1;
    }
    其他
    {
    如果(标志= 1)
    {
    T2 = TACCR1;
    如果(T2 > T1)
    T = T2-T1;
    lcd_freq();
    }
    其他
    {
    tar = 0;
    }
    捕捉= 0;
    标志= 0;
    }
    中断;
    
    案例 TAIV_TACCR2:
    break;
    
    案例 TAIV_TAIFG:
    tick++;
    如果(节拍== 60)
    {
    lcd_freq();
    节拍= 0;
    }
    如果(标志= 1)
    标志= 0;
    中断;
    
    默认值:
    中断;
    }
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很高兴它成功了。