用51单片机测量振动周期失败

程序如下,测量的是方波信号,一个大的周期内包含许多小的方波信号,用两个最大频率的方波间隔的时间来求这个周期。感觉理论上可行,但是测不出来

img

img

img

发一下完整的代码

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7772708
  • 你也可以参考下这篇文章:利用汇编编写51单片机串口通信程序,实现对于按键次数的显示
  • 除此之外, 这篇博客: 详细介绍如何从0开始写一个数据通信,将数据从单片机发送到上位机(或者虚拟示波器)进行数据或图像显示,以及常见问题或注意事项解答,本文主要以匿名上位机为例,适合新手和小白中的     大端模式的单片机(比如常见的51单片机): 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
        data_to_send[_cnt++] = BYTE1(_a);
        data_to_send[_cnt++] = BYTE0(_a);
    	
        data_to_send[_cnt++] = BYTE1(_b);
        data_to_send[_cnt++] = BYTE0(_b);
    	
        data_to_send[_cnt++] = BYTE1(_c);
        data_to_send[_cnt++] = BYTE0(_c);
    	
        data_to_send[_cnt++] = BYTE1(_d);
        data_to_send[_cnt++] = BYTE0(_d);
    
  • 您还可以看一下 朱有鹏老师的巫妖王51单片机开发板配套视频课程课程中的 测试确认开发板硬件完好2小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    由于问题描述比较抽象,不确定是哪个具体的振动周期无法测量,因此无法给出具体的解决方案。但可以给出一般的解决思路:

    1. 确认硬件是否正常连接:检查传感器或其他测量振动周期的硬件连接是否正确,例如是否接反、是否有接触不良等问题。
    2. 确认代码是否正确:检查代码中涉及到测量振动周期的部分是否正确,例如是否设置了正确的采样频率、是否读取传感器数据的方式正确等。
    3. 确认采用的采样模式是否适合测量振动周期:不同的采样模式适用于不同的信号类型,例如有些模式适合于直流信号,有些模式适合于周期信号,需要根据实际情况选择合适的采样模式。
    4. 确认采集到的数据是否正确:通过调试程序,检查采集到的数据是否符合预期,例如是否存在明显的波动周期等。
    5. 针对具体问题,进一步对代码和硬件进行排查:例如对于无法观测到振动周期的情况,可以检查传感器是否能够输出有效的信号、是否存在信号传输中断等问题,或者尝试通过改变硬件或调整代码的方式来解决。具体需要根据实际情况进行排查和调试。

    代码示例:

    以下是一个简单的示例代码,用于测量振动信号的周期。该代码通过读取传感器数据,计算出信号波形的周期,并输出到串口以供观察。

    #include <stdio.h>
    
    // 定义采样率
    #define SAMPLE_RATE 1000
    
    // 定义采样数组大小
    #define SAMPLE_SIZE 100
    
    // 定义采样数组
    int sample_data[SAMPLE_SIZE];
    
    // 计算周期函数
    float calc_period(int *sample_data, int sample_size, float sample_rate) {
        float period = 0;
        int i = 0;
        int count = 0;
        int max_idx = 0;
        int max_value = 0;
        int start_idx = 0;
        int end_idx = 0;
        float time_diff = 0;
    
        // 找到波形最高点
        for(i=0; i<sample_size; i++) {
            if (sample_data[i] > max_value) {
                max_value = sample_data[i];
                max_idx = i;
            }
        }
    
        // 找到最高点前面的谷底,作为波形起点
        for(i=max_idx; i>=0; i--) {
            if (sample_data[i] < max_value/10) {
                start_idx = i;
                break;
            }
        }
    
        // 找到最高点后面的谷底,作为波形终点
        for(i=max_idx; i<sample_size; i++) {
            if (sample_data[i] < max_value/10) {
                end_idx = i;
                break;
            }
        }
    
        // 计算起点和终点之间的时间差
        time_diff = (end_idx - start_idx) / sample_rate;
    
        // 计算周期
        period = 2 * time_diff;
    
        return period;
    }
    
    int main(void) {
        int i = 0;
        float period = 0;
    
        // 采集数据
        for(i=0; i<SAMPLE_SIZE; i++) {
            // 读取传感器数据,将其存入采样数组
            sample_data[i] = read_sensor_data();
        }
    
        // 计算周期
        period = calc_period(sample_data, SAMPLE_SIZE, SAMPLE_RATE);
    
        // 输出周期数据
        printf("Period: %fms", period);
    
        return 0;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^