elephant00 发表于 2024-7-26 18:37

stm32管脚输出波形抖动程序如下

本人从MCS—51转到STM32,在学习中发现,STM32输出的波形会有抖动,我程序操作过程是:
#define c1_set GPIO_SetBits(GPIOA, GPIO_Pin_1);
#define c1_clr GPIO_ResetBits(GPIOA, GPIO_Pin_1);
其它程序省略
while(1)
{
       c1_set;
        delay_us(4);
        c1_clr;
        delay_us(4);
        c1_set;
        delay_us(4);
        c1_clr;
        delay_us(4);
        c1_set;
        delay_us(4);
        c1_clr;
        delay_us(4);
        c1_set;
        delay_us(4);
        c1_clr;
        delay_us(4);
}
/延时US级函数
void delay_us(int i)
{
  int j;
  while(i>0)
  {
  for(j=0;j

LcwSwust 发表于 2024-7-26 19:01

有波形吗?抖动有多少?

xionghaoyun 发表于 2024-7-27 14:54

抖正常 你自己写的延迟啊

LOVEEVER 发表于 2024-7-28 13:41

抖动还是需要进行相关滤波算法

范德萨发额 发表于 2024-7-29 15:47

你使用的软件延时函数delay_us可能不够精确,导致波形不稳定。

申小林一号 发表于 2024-7-29 22:37

感谢分享

纠结的那些年 发表于 2024-7-31 11:59

使用GPIO_SetBits和GPIO_ResetBits进行GPIO操作可能会有一些额外的延时

AdaMaYun 发表于 2024-7-31 12:46

有抖动正常,需要进行滤波处理

公羊子丹 发表于 2025-3-20 08:20

你的波形抖动问题可能是延时函数 delay_us() 的精度不够高,建议使用硬件定时器来生成精确的延时,这样可以减少 CPU 处理延时时的抖动。

周半梅 发表于 2025-3-20 08:21

试试用 HAL_Delay() 来代替 delay_us(),它能够提供更加稳定的延时控制。或者直接使用定时器生成精确的时间控制。

帛灿灿 发表于 2025-3-20 08:22

你这段代码看起来应该是用来产生方波,STM32 其实有很多方式可以做这件事,比如直接用定时器输出 PWM 信号,可能比用延时函数要稳定得多。

童雨竹 发表于 2025-3-20 08:23

你可以尝试用硬件定时器定期切换 GPIO 引脚状态,这样能避免软件延时带来的不稳定,精度会高很多。

万图 发表于 2025-3-20 08:24

你这个 delay_us() 函数是用忙等方式实现的,会占用 CPU,可能造成程序执行不流畅。使用定时器或者中断来进行延时可能效果更好。

Wordsworth 发表于 2025-3-20 08:25

你能提供一下 delay_us() 函数的完整代码吗?如果它的精度不足,可能会导致波形抖动。如果是简单的循环,可能会受到编译器优化的影响。

Bblythe 发表于 2025-3-20 08:26

可以考虑优化延时函数,避免高精度延时占用过多的 CPU 时间。一个更优的做法是使用一个计时器与中断来产生精确的时间间隔。

Pulitzer 发表于 2025-3-20 08:27

STM32 支持 DMA 和定时器,若你用定时器配合 PWM 模式生成方波,会更加精确稳定,避免软件延时带来的波形误差。

Uriah 发表于 2025-3-20 08:28

另外,检查一下 GPIO 的配置,确保输出模式正确,有时如果配置不当也会导致波形不稳定或抖动。

Clyde011 发表于 2025-3-20 08:29

如果频率要求不高,也可以调整延时的长度,增加 delay_us() 中的循环次数,看看波形的抖动是否会减轻。
页: [1]
查看完整版本: stm32管脚输出波形抖动程序如下