【TB作品】MSP430F6638单片机,频率计

发布于:2024-07-14 ⋅ 阅读:(141) ⋅ 点赞:(0)

基于 MSP430-FFTB6638 实验箱

频率测量与通信系统 利用 MCU 定时器模块相关功能设计实现数字频率计功能,测量范围:100~10000Hz, 测量误差≤1%,测量速度≤1 秒。测量结果本地显示(段式 LCD、字符型 LCD、点阵 LCD (128x64)、点阵 LED(16x16)或多位 7 段 LED 等),同时通过 UART/RS232 通讯把测 量结果传送到 PC/平板/手机等其他终端。

项目设计基本要求(必做):
(1)项目名称、学号、姓名、测量结果等信息的本地显示(段式 LCD、字符型 LCD、 点阵 LCD(128x64)、点阵 LED(16x16)或多位 7 段 LED 等)。
(2)项目名称、学号、姓名、测量结果等信息通过 UART/RS232 握手通讯(握手信号 为本人序号或学号)传送到 PC/平板/手机等其他终端。
(3)蜂鸣器声响提示项目功能的开始或不同蜂鸣器声响指示不同工作状态,如通信握 手的正确与否。
项目设计提高要求(选做):
(1)用按键或串口命令实现不同功能的转换。
(2)项目名称、姓名等信息的中文显示。

代码功能如下:
测量定时器模块或中断相关引脚输入信号的频率,结果送到字符型 LCD/LED 等 进行显示。可在点阵 LCD 上稳定显示项目名称、学号、姓名等信息;
握手:
电脑发送学号给单片机,单片机收到这个字符串后,蜂鸣器响一声,并回发一个字符串给电脑显示频率。
电脑发送别的字符给单片机,单片机响三声,发送一个字符串给电脑告诉正确握手信号。
蜂鸣器声响提示项目功能的开始。
选做内容一:用按键实现信号频率/周期的显示转换。
选做内容二:中文显示

代码:

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

实物效果:
在这里插入图片描述

频率测量——使用MSP430F6638的捕获模式

在嵌入式系统中,频率测量是一个非常常见且重要的任务。本文将介绍如何使用MSP430F6638的捕获模式来实现频率测量。我们将详细讲解相关代码,并解释其工作原理。

1. 初始化捕获模式

在MSP430F6638中,我们可以利用定时器和捕获/比较寄存器(CCR)来实现频率测量。首先,我们需要初始化捕获模式。以下是初始化捕获模式的代码:

//频率测量变量
uint16_t capv1 = 0;
uint16_t capv2 = 0;
uint32_t period = 0;
uint32_t frequency = 0;
uint8_t cap_flag = 0;

void init_cap(void) {
    //捕获引脚配置
    P1DIR &= ~BIT4; /* 配置P1.4为输入,用于捕获电平TA0.3 */
    P1SEL |= BIT4;  /* 将P1.4配置为TA0.3捕获功能 */

    // 配置捕获模式
    TA0CCTL3 = CM_1 + SCS + CCIS_0 + CAP + CCIE; 
    /* CM_1: 上升沿捕获
       SCS: 同步捕获
       CCIS_0: 捕获输入选择CCIxA
       CAP: 捕获模式
       CCIE: 捕获/比较中断使能 */

    // 配置定时器
    TA0CTL = TASSEL_2 + MC_2 + TACLR + ID_3;
    /* TASSEL_2: 选择SMCLK作为时钟源
       MC_2: 连续模式
       TACLR: 清除定时器
       ID_3: 输入时钟除以8 */
}

在上述代码中,我们首先配置了P1.4引脚作为捕获输入,然后设置捕获/比较寄存器TA0CCTL3的相关参数,最后配置定时器TA0CTL。

2. 捕获中断服务程序

捕获中断服务程序是实现频率测量的核心部分。以下是捕获中断服务程序的代码:

// 捕获中断
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1() {
    switch (__even_in_range(TA0IV, 14)) {
        case 0:
            break;                          // 无中断
        case 2:
            break;                          // CCR1未用
        case 4:
            break;                          // CCR2未用
        case 6:
            // 捕获TA0.3
            if (TA0CCTL3 & CCI) {
                if (cap_flag == 0) {
                    capv1 = TA0CCR3;
                    cap_flag = 1;
                } else if (cap_flag == 1) {
                    capv2 = TA0CCR3;
                    cap_flag = 2;
                }
            }
            break;                          // CCR3
        case 8:
            break;                          // 保留
        case 10:
            break;                          // 保留
        case 12:
            break;                          // 保留
        case 14:
            break;
        default:
            break;
    }

    TA0CCTL3 &= ~CCIFG;  // 清除中断标志
}

在上述代码中,我们使用中断向量TIMER0_A1_VECTOR来处理定时器A0的中断。通过检查TA0IV寄存器的值,我们可以确定是哪个CCR引发了中断。在这种情况下,我们关注的是CCR3。在每次中断时,我们检查捕获输入标志(CCI),并根据cap_flag变量的值来保存捕获的时间戳。

3. 计算频率

在捕获了两个时间戳后,我们可以计算信号的周期和频率。假设我们已经捕获了两个上升沿的时间戳capv1和capv2,可以通过以下公式计算周期和频率:

period = c a p v 2 − c a p v 1 \text{period} = capv2 - capv1 period=capv2capv1

frequency = clock_frequency period \text{frequency} = \frac{\text{clock\_frequency}}{\text{period}} frequency=periodclock_frequency

假设我们的时钟频率是2MHz(经过8分频后),则频率的计算代码如下:

if (cap_flag == 2) {
    period = capv2 - capv1;
    frequency = 2000000 / period;
    cap_flag = 0;  // 重置标志以捕获下一组信号
}

4. 结论

通过上述步骤,我们实现了一个简单的频率测量程序。通过配置捕获模式、编写中断服务程序以及计算信号的周期和频率,我们能够准确地测量输入信号的频率。这种方法可以广泛应用于各种嵌入式系统中,帮助开发者实现对频率的精确测量。


网站公告

今日签到

点亮在社区的每一天
去签到