找回密码
 立即注册
查看: 82|回复: 2

设置10us的波,检测时时8us

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-24 11:56:26
已绑定手机

2

主题

1

回帖

12

积分

新手上路

积分
12
发表于 2025-3-24 11:56:26 | 显示全部楼层 |阅读模式
#include    "config.h"
#include    "STC32G_Exti.h"
#include    "STC32G_GPIO.h"
#include    "STC32G_UART.h"
#include    "STC32G_NVIC.h"
#include    "STC32G_Delay.h"
#include    "STC32G_Switch.h"
#include    "STC32G_Timer.h"
#include    "STC32G_PWM.h"
#include    "type_def.h"

sbit INT0 = P3^2;
sbit INT1 = P3^3;
sbit INT2 = P3^6;
sbit INT3 = P3^7;
sbit INT4 = P3^0;
u16 countnumber = 1495;
u16 counttime = 0;
u16 Read_Timer0_Count(void);
void calculate_duty_cycle_INT2(void);
void calculate_duty_cycle_INT3(void);
void send_sent_data(void);
void GPIO_config(void);
#define SYNC_CALIBRATION_TICKS  56      
#define STATUS_COMM_TICKS_MIN    12      
#define STATUS_COMM_TICKS_MAX    27
#define DATA_TICKS_MIN           12      
#define DATA_TICKS_MAX           27      
#define CRC_TICKS                12      
#define PAUSE_PULSE_TICKS        21      
#define TICK_TIME                3      
#define SYNC_CALIBRATION_TIME    (SYNC_CALIBRATION_TICKS * TICK_TIME)
#define STATUS_COMM_TIME_MIN     (STATUS_COMM_TICKS_MIN * TICK_TIME)
#define STATUS_COMM_TIME_MAX     (STATUS_COMM_TICKS_MAX * TICK_TIME)
#define DATA_TIME_MIN            (DATA_TICKS_MIN * TICK_TIME)
#define DATA_TIME_MAX            (DATA_TICKS_MAX * TICK_TIME)
#define CRC_TIME                 (CRC_TICKS * TICK_TIME)
#define PAUSE_PULSE_TIME         (PAUSE_PULSE_TICKS * TICK_TIME)
typedef enum {
    STATE_IDLE,
    STATE_SYNC,
    STATE_PAUSE,
    STATE_DATA_NIBBLE,
    STATE_CRC,
    STATE_END
} sent_state_t;
volatile sent_state_t current_state = STATE_IDLE;
volatile u8 nibble_index = 0;
u8 status_nibble = 0x00;   
u8 data_nibbles[6] = {0x05, 0x0D, 0x07, 0x0B, 0x0C, 0x0A};
u8 crc_nibble = 0x0B;      
volatile u32 g_us_count = 0;

void Timer1_Init(void) {
    AUXR |= 0x40;      // ¶¨Ê±Æ÷ʱÖÓ 1T ģʽ
    TMOD &= 0x0F;      // ÉèÖö¨Ê±Æ÷ģʽ
    TL1 = 0xE8;        // ÉèÖö¨Ê±³õʼֵ
    TH1 = 0xFF;        // ÉèÖö¨Ê±³õʼֵ
    TF1 = 0;           // Çå³ý TF1 ±êÖ¾
    ET1 = 1;           // ʹÄܶ¨Ê±Æ÷ 1 ÖжÏ
    TR1 = 0;           // ³õʼ»¯Ê±²»Æô¶¯¶¨Ê±Æ÷
}

void Timer1_Isr(void) interrupt 3 {
    TF1 = 0;           
    g_us_count++;      
}

void delay_us(u32 us) {
    u32 start_count = g_us_count;
    u32 target_count = start_count + us;

    TR1 = 1;  

    while (1) {
        if (target_count >= start_count) {
            if (g_us_count >= start_count && g_us_count < target_count) {
                continue;
            } else if (g_us_count >= target_count) {
                break;
            }
        } else {
            if ((g_us_count >= start_count) || (g_us_count < target_count)) {
                continue;
            } else {
                break;
            }
        }
    }

    TR1 = 0;  // Í£Ö¹¶¨Ê±Æ÷
}

void set_high() {
    P3 |= 0x08;
}

void set_low() {
    P3 &= ~0x08;
}

// ·¢ËÍÒ»¸ö¸ßµçƽÂö³å
void send_high_pulse(u32 duration) {
    set_high();
    delay_us(duration);
    set_low();
}

void send_sent_data() {
    static u8 current_nibble;
    current_state = STATE_SYNC;
    send_high_pulse(SYNC_CALIBRATION_TIME);

    current_state = STATE_PAUSE;
    send_high_pulse(PAUSE_PULSE_TIME);

    current_state = STATE_DATA_NIBBLE;
    nibble_index = 0;
    // ·¢ËÍ״̬×Ö¶Î
    current_nibble = status_nibble;
    send_high_pulse(STATUS_COMM_TIME_MIN);

    // ·¢ËÍÊý¾Ý×Ö¶Î
    for (nibble_index = 0; nibble_index < 6; nibble_index++) {
        u32 pulse_duration;
        current_nibble = data_nibbles[nibble_index];
        if (current_nibble + 1 < 3) {
            pulse_duration = DATA_TIME_MIN;
        } else if (current_nibble + 1 > 7) {
            pulse_duration = DATA_TIME_MAX;
        } else {

            pulse_duration = (current_nibble + 1 + 12 - 1) * TICK_TIME;
        }
        send_high_pulse(pulse_duration);
    }
    current_state = STATE_CRC;
    current_nibble = crc_nibble;
    send_high_pulse(CRC_TIME);


    current_state = STATE_END;
    send_high_pulse(10 * TICK_TIME);

    current_state = STATE_IDLE;
}


void GPIO_config(void) {
    P3_MODE_OUT_PP(GPIO_Pin_3);  
    set_high();
}


void main(void) {
    WTST = 0;
    EAXSFR();
    CKCON = 0;

    GPIO_config();
    Timer1_Init();
    EA = 1;

    while (1) {
       // send_sent_data();
                          set_high();
                          delay_us(10);
                          set_low();
        delay_us(10); // ÑÓʱ 10us
    }
}

回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-24 11:58:00 | 显示全部楼层
在您的代码中,您提到设置了一个10微秒的波,但实际检测到的波形宽度为8微秒。这种差异可能由多种因素引起,以下是一些可能的原因及解决方案:

1. 定时器配置问题
定时器精度:STC32G系列微控制器的定时器精度受限于时钟频率和预分频器设置。如果定时器的时钟源或预分频器配置不当,可能导致计时不准确。
解决方案:检查定时器的时钟源和预分频器设置,确保其与预期的10微秒波形匹配。例如,如果系统时钟为12MHz,定时器预分频器应设置为1,以实现1微秒的计时精度。

2. 中断响应时间
中断延迟:当检测到外部中断时,微控制器需要一定的时间来响应中断并执行相应的中断服务程序(ISR)。这段延迟可能导致检测到的波形宽度小于实际值。
解决方案:优化中断服务程序,减少不必要的操作,以缩短中断响应时间。此外,可以考虑使用更高优先级的中断来确保快速响应。

3. 硬件信号抖动
信号抖动:硬件信号可能存在抖动或噪声,导致检测到的波形宽度不准确。
解决方案:在硬件设计上加入滤波电路,减少信号抖动。在软件层面,可以通过多次采样并取平均值来提高检测的准确性。

4. 代码执行效率
代码执行时间:在检测波形宽度的过程中,代码的执行效率可能影响检测结果。如果代码执行时间较长,可能导致检测到的波形宽度偏小。
解决方案:优化代码结构,减少不必要的计算和操作,确保代码执行时间尽可能短。

5. 定时器溢出处理
定时器溢出:如果定时器在检测过程中发生溢出,可能导致检测结果不准确。
解决方案:在定时器溢出时,正确处理溢出事件,并确保检测结果的准确性。

6. 调试与验证
调试工具:使用示波器或逻辑分析仪等调试工具,实时监测波形宽度,并与软件检测结果进行对比,以验证检测的准确性。
解决方案:通过调试工具发现问题并进行调整,确保软件检测结果与实际波形宽度一致。

总结
在实际应用中,波形宽度的检测受到多种因素的影响。通过优化定时器配置、减少中断响应时间、处理信号抖动、提高代码执行效率以及使用调试工具进行验证,可以有效提高检测的准确性。希望上述分析与解决方案能够帮助您解决当前的问题。

如果您有进一步的问题或需要更详细的调试建议,请随时联系。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-24 14:41:03 | 显示全部楼层
直接在中断里翻转引脚测量波形,你的延时函数里操作TR1有影响
截图202503241440591327.jpg


截图202503241440153945.jpg

三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:21 , Processed in 0.117946 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表