方波每秒跳几次,单片机怎样自己量出来? 方波每秒跳几次单片机怎样自己量出来本文为教学接线与设计预期尚无实物测量记录使用 NUCLEO-F030R8。问题一根线上不停出现高低电平单片机怎么知道它每秒跳了几次它不是靠人在屏幕前数而是让定时器记下两次上升沿的时刻。我们用两块相同的开发板左边产生低压方波右边只测量不假装已经取得实物波形。物件动作想象小熊拿秒表站在门口。第一面小旗升起它按下记号第二次同样的旗升起它再按一次。两张时间卡相减得到两次同样动作之间的间隔。回到电路旗是 PA八脚的上升沿时间卡是定时器的捕获寄存器。真实连接左边 NUCLEO 开发板的 D七也就是 PA八输出低压方波经过一千欧串联电阻到右边同型号板的 D七、PA八输入。两块板的地必须连在一起各自按官方方法供电。不连五伏也不把两块板的三点三伏电源脚相接。原因与结果右边定时器先设成每微秒加一格。第一次上升沿到来硬件把计数值存进第一张时间卡下一次上升沿再存第二张。假设两张卡是 一万 和 一万二千相差两千格就是两千微秒。用一秒除以这个间隔设计频率是五百赫兹。验证断电核对输出、串联电阻、输入和公共地。示波器探头接右板 PA八地夹接公共地先确认电压在零到三点三伏之间。程序记录连续捕获值再用差值计算周期。若源板改成另一频率示波器周期和计算结果应一起变化本篇没有实测值。边界只看两次上升沿能量频率不能单靠它知道高电平持续多久。噪声多出一个假边沿或者程序来不及处理导致捕获溢出都会算错。计数器回绕也要按模数处理。输入超过芯片允许范围时不能指望那一千欧代替电平转换。今天要解决的不是‘怎样发方波’而是‘怎样量方波’本篇使用两块 ST NUCLEO-F030R8分别称源板和测量板。源板按已核对的 TIM1 输出比较翻转例子产生低压方波测量板把外部信号送进 TIM1_CH1 输入捕获。虽然两块板都用 D7/PA8方向完全不同源板的 PA8 是输出测量板的 PA8 是输入。它们不是同一颗芯片内部短接的两个引脚。不要把‘输出比较’和‘输入捕获’混成同一种工作模式也不要把两块板的电源脚直接并接。全文的 8 MHz、1 MHz、2000 个计数和 500 Hz 都是明确配置下的设计计算项目没有真实波形或测量记录。小熊的工作可以画成两幕源板上的小灯牌第一次由低变高小熊手拿秒表从左侧门口跑到测量桌把第一张时间卡写为 10000第二次同样由低变高又送来 12000。桌上还有一把刻着‘每格 1 微秒’的尺小熊拿探针指向两张卡之间的 2000 格随后举旗报出 2 毫秒。回到电路两面旗就是测量板 PA8 的连续两个上升沿时间卡是 TIM1_CCR1 在边沿到来时锁存的 CNT 值尺子是定时器实际计数频率。卡通不能代替引脚连接哪一块板输出、哪一块板输入和公共地都必须在接线图里看见。为什么选择这个引脚和这两块板ST UM1724 的 NUCLEO-F030R8 Arduino 接口表把 CN9 D7 映射到 PA8。STM32F030R8 数据手册将 PA8 的一个复用功能列为 TIM1_CH1。ST RM0360 输入捕获章节说明通道一可将 TI1 作为输入边沿到来时把当前计数器 CNT 锁存到 CCR1并设置捕获标志。三份资料分别支持板卡外部接口、芯片引脚复用、定时器内部行为不能把只出现了 PA8 名称的图页当成完整接线证明。所选源板 TIM1 输出比较翻转模式也要经 PA8 引出为了让本篇专注测量把源板当成一个已核对配置的低压脉冲来源不编造它已经实测为完美 500 Hz。断电时源板 CN9 D7/PA8 接 R1 一千欧一端R1 另一端接测量板 CN9 D7/PA8。源板 CN6 GND 与测量板 CN6 GND 相连。两块板各自按照 ST 板卡手册供电本例不把两块板 CN6 3V3 相连也不把任何 5 V 脚接到测量板输入。示波器 CH1 探头只接测量板 PA8 输入节点地夹接公共地示波器不是串在线中的电阻或传感器。源板输出、串联电阻、测量板输入是一条信号路径地线是不可省的回流与电平参考路径。R1 只限制误接时的某些电流不能把任意高压变成允许的输入电平。接实物前必须核对各自供电状态再量输入节点电压范围。两次边沿怎样变成一个周期测量板将 PA8 设为 TIM1_CH1 的复用输入选择 TI1 直连通道一选择上升沿捕获并启用通道捕获。RM0360 中 CC1S01 表示这一输入映射CC1IF 标志表示取得一次捕获CC1OF 表示前一次尚未处理又来了新捕获。这里只给出关键配置关系不把桌面算例冒充完整可烧录的寄存器固件。启动前还要核对定时器时钟树、预分频、自动重装值、GPIO 复用和中断或轮询处理。假定实际 TIM1 输入时钟已经核对为 8 MHzPSC 写 7计数频率就是 8 MHz÷(71)1 MHz一格 1 微秒。ARR 设为 65535 时计数器在 0 到 65535 之间循环。若第一张卡是 10000、第二张是 12000差为 2000 格也就是 2000 微秒或 2 毫秒。相同方向的相邻两个边沿之间就是一个完整周期于是 1 秒÷0.002 秒500 Hz。不能拿一高一低两个相邻边沿直接套这个频率公式那通常只是半个周期除非另外明确测的是高电平宽度。源板若按 8 MHz、PSC7、ARR999 的每圈单次翻转设计也预期约每 1 ms 翻一次、两圈组成 2 ms 周期两块板的实际时钟误差仍要靠测量发现。计数器回绕并不一定让结果作废。例如第一张卡为 65000下一张为 1464直接相减得到负数在 ARR65535 的前提下按 65536 取模真实跨过的仍是 2000 格。随文 C11 程序用无符号 16 位减法演示这个算例。但是若两次边沿之间跨过了不止一个完整回绕单靠两个 16 位值无法知道漏掉了几圈应增加溢出累计或缩短测量间隔。若两次时间卡相同要先判断是零间隔误读、刚好完整回绕还是丢沿不能直接做除以零。如何核对正常过程和反例第一步断电查线D7 源输出确实经 R1 到测量 D7两个 GND 相连3V3 与 5V 电源脚没有跨板相连。第二步分别给两板供电并用示波器看测量板 PA8 对公共地的波形。设计上应是低压方波不能在确认电压之前就打开捕获配置。第三步让测量板保存连续两个 CCR1 值及 CC1IF、CC1OF 状态打印计数差和换算频率。这里不提供任何假装实测的截图若波形不在预期范围或两块板没有共同地就停止连接检查。正常例子是两次上升沿间隔约 2 ms计算约 500 Hz。反例一输入有毛刺多出一个假上升沿计数差缩短程序可能误报更高频率先看示波器必要时按 RM0360 配置输入滤波并明白滤波会带来时间延迟和能过滤的毛刺范围。反例二CC1OF 已置位说明新捕获覆盖了尚未处理的前一次数据此时不要把不相邻的两张卡当成一个周期。反例三源板变成很低频超过一个 16 位计数周期必须累计更新事件。反例四有方波但软件始终没有捕获先核对 PA8 复用、CC1S、极性、通道使能与定时器时钟而不是立刻改接到另一只引脚。输入捕获测的是边沿时间戳不会自己推断信号的电压合不合规也不会替你测占空比。如果要量高电平持续时间还要记录相反极性的边沿或使用合适的 PWM 输入方案并分别处理毛刺和回绕。不同芯片或 NUCLEO 板型号的 D7 映射可能变化换板必须重新查手册本图只对 ST NUCLEO-F030R8 和本例两块板的连接负责。逐线接线清单源板 CN9 D7/PA8 TIM1_CH1 输出 → R1 1 kΩ 一端低压方波源R1 1 kΩ 另一端 → 测量板 CN9 D7/PA8 TIM1_CH1 输入被捕获的 TI1 上升沿源板 CN6 GND → 测量板 CN6 GND两板公共电压参考示波器 CH1 探头 → 测量板 PA8 输入节点核对实际低压方波示波器地夹 → 两板公共 GND测量参考示波器不是信号回路负载计算与实施边界ST UM1724NUCLEO-F030R8 CN9 D7 对应 PA8STM32F030R8 数据手册PA8 可选 TIM1_CH1ST RM0360输入捕获把边沿时 CNT 锁存到 CCR1CC1S01 连接 TI1CC1IF 标志及 CC1OF 过捕获须检查本例假定右板定时器实际输入时钟 8 MHzPSC7 得 1 MHz两次捕获差 2000 格即 2 ms频率 500 Hz均为配置假设和计算结果非实测两板各自供电只相连信号和地不得把两路电源脚或 5 V 接到 PA81 kΩ 串联电阻不是过压电平转换器现场先用示波器核对 03.3 V 和共地若 ARR65535则跨回绕的计数差须按 65536 取模丢沿、噪声和过捕获须另行处理这些参数和数值是本例选择或可复算计算实际测量前应先检查电源极性、公共地、元件额定值、仪器探头连接。完整可运行的核心算例与验收以下 C11 程序可在电脑上用 C 编译器单独编译运行用来复算状态或数值它不是已配置 GPIO、ADC、定时器和驱动的开发板固件。移植到实板时应按前述接线配置外设、检查读取错误并另做实测。#includestdint.h#includestdio.h/* 只演算已捕获的两个 CCR1 值不冒充完整寄存器初始化。 */staticuint16_tticks_between(uint16_tfirst,uint16_tnext){return(uint16_t)(next-first);/* ARR65535 时自然按 65536 回绕 */}intmain(void){constuint32_ttimer_hz8000000u/(7u1u);constuint16_tfirst10000u,next12000u;constuint16_tticksticks_between(first,next);printf(ticks%u, period%0.3f ms, frequency%0.1f Hz\n,ticks,1000.0*ticks/timer_hz,(double)timer_hz/ticks);printf(wrap example ticks%u\n,ticks_between(65000u,1464u));return0;}验收时同时记录输入、关键节点电压或波形、程序输出若发现传感器通信失败、输入超出允许范围或波形明显异常应停止并排查。官方资料https://www.st.com/resource/en/user_manual/um1724-.pdfhttps://www.st.com/resource/en/datasheet/stm32f030r8.pdfhttps://www.st.com/resource/en/reference_manual/dm00091010.pdf