打印
[技术问答]

如何测量PWM信号的周期和占空比?

[复制链接]
508|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongnanxibei|  楼主 | 2024-9-7 15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果有个设备发出的是PWM信号,如何用单片机测量其信号的周期和占空比呢?

使用特权

评论回复
沙发
dongnanxibei|  楼主 | 2024-9-7 15:04 | 只看该作者
有没有相关的示例或者方案?

使用特权

评论回复
板凳
zhuomuniao110| | 2024-9-7 15:07 | 只看该作者
你这好麻烦,如果只是一次性的测量,你用示波器啊。

使用特权

评论回复
地板
zhuomuniao110| | 2024-9-7 15:07 | 只看该作者
使用示波器
示波器是最直接、最精确的测量工具,尤其适合调试和观察信号的实时波形。
步骤:
将探针连接到PWM信号的输出端。
示波器会显示信号的波形,从中可以直接读取周期和占空比。
周期 是波形的一个完整循环时间,可以直接从时间轴上读取。
占空比 是高电平时间占整个周期的比例,可以通过示波器的自动测量功能获得。

使用特权

评论回复
5
zhuomuniao110| | 2024-9-7 15:08 | 只看该作者
如果非要用单片机可以考虑用捕获功能,看看你的单片机上有没有PWM捕获功能,一般有个捕获定时器的功能。

使用特权

评论回复
6
zhuomuniao110| | 2024-9-7 15:08 | 只看该作者
用微控制器的捕获功能
大多数微控制器都有定时器的捕获功能,可以用于测量PWM信号的周期和占空比。

步骤:
配置定时器的捕获模式,通常需要连接到PWM信号的引脚。
设置捕获中断,记录上升沿和下降沿的计数值。
通过上升沿到上升沿的时间差来计算周期。
通过上升沿到下降沿的时间差来计算高电平时间,从而计算占空比。

使用特权

评论回复
7
zhuomuniao110| | 2024-9-7 15:09 | 只看该作者
使用频率计和占空比测量仪
频率计通常带有测量PWM信号占空比的功能,可以非常方便地直接读取。

步骤:
将频率计接入PWM信号。
仪器会显示周期、频率以及占空比。

使用特权

评论回复
8
zhuomuniao110| | 2024-9-7 15:09 | 只看该作者
另外还可以用使用Arduino进行测量
Arduino 的 pulseIn() 函数可以用来测量PWM信号的高电平和低电平时间,进而计算周期和占空比。
int pin = 7;  // PWM信号输入引脚
unsigned long highTime;
unsigned long lowTime;
float dutyCycle;
float period;

void setup() {
  Serial.begin(9600);
}

void loop() {
  highTime = pulseIn(pin, HIGH);  // 测量高电平时间
  lowTime = pulseIn(pin, LOW);    // 测量低电平时间
  period = highTime + lowTime;    // 计算周期
  dutyCycle = (highTime * 100.0) / period;  // 计算占空比
  Serial.print("Period: ");
  Serial.print(period);
  Serial.print(" us");
  Serial.print("\tDuty Cycle: ");
  Serial.print(dutyCycle);
  Serial.println(" %");
  delay(1000);
}

使用特权

评论回复
9
classroom| | 2024-9-7 15:23 | 只看该作者
使用单片机的定时器输入捕获功能。当PWM信号的上升沿或下降沿触发时,定时器捕获当前计数值。
通过连续捕获两个上升沿(或下降沿)之间的时间差,即可得到PWM信号的周期。

使用特权

评论回复
10
laocuo1142| | 2024-9-7 16:06 | 只看该作者
设置单片机的外部中断来响应PWM信号的上升沿或下降沿。
在中断服务程序中记录时间戳,并通过计算连续两次中断之间的时间差来得到PWM信号的周期。

使用特权

评论回复
11
flycamelaaa| | 2024-9-7 17:23 | 只看该作者
使用定时器的输入捕获功能来分别捕获PWM信号的上升沿和下降沿的计数值。
通过计算高电平时间和整个周期时间的比例,即可得到占空比。

使用特权

评论回复
12
powerantone| | 2024-9-7 19:03 | 只看该作者
使用外部中断来响应PWM信号的上升沿和下降沿。
在中断服务程序中,根据当前信号的电平状态(上升沿或下降沿)来记录时间戳。
通过计算两个相邻上升沿(或下降沿)之间的时间差,以及高电平时间,来计算占空比。

使用特权

评论回复
13
mmbs| | 2024-9-9 10:03 | 只看该作者
在示波器上读取PWM信号的周期和高电平时间长度,然后根据占空比的定义(高电平时间长度除以周期)计算出占空比。

使用特权

评论回复
14
eefas| | 2024-9-9 11:31 | 只看该作者
捕获第一个上升沿,记录定时器的值。
捕获下一个上升沿,再次记录定时器的值。
定时器的差值经过时钟频率换算后,即为PWM信号的周期。

使用特权

评论回复
15
robertesth| | 2024-9-9 13:48 | 只看该作者
利用中断服务程序来测量PWM信号。在这种方法中,可以将一个普通IO端口设置为输入模式,并开启外部中断。当上升沿中断触发时,启动内部定时器;当下降沿中断触发时,停止计时并记录高电平时间,然后清零定时器并等待下一个上升沿到来,记录低电平时间。最后,根据这些记录值计算出占空比。

使用特权

评论回复
16
earlmax| | 2024-9-9 15:49 | 只看该作者
如果使用微控制器内部的定时器,需要考虑定时器的溢出和预分频设置。

使用特权

评论回复
17
jkl21| | 2024-9-9 17:15 | 只看该作者
测量两个上升沿(或下降沿)中间的间隔时间来计算频率

使用特权

评论回复
18
averyleigh| | 2024-9-9 20:25 | 只看该作者
通过配置单片机的定时器为输入捕获模式,可以直接测量PWM信号的周期和占空比。以STM32为例,可以配置TIMx的两个通道(IC1和IC2)来实现这一功能。当PWM信号的第一个上升沿到来时,定时器的计数器被复位;当下降沿到来时,IC2会发生捕获事件,记录此时的计数值(记为IC2_DATA2);当第二个上升沿到来时,IC1发生捕获事件,记录此时的计数值(记为IC1_DATA1)。由此,可以通过计算得出PWM的频率和占空比。

使用特权

评论回复
19
adolphcocker| | 2024-9-9 23:27 | 只看该作者
配置定时器:将单片机的定时器配置为适当的模式(如向上计数模式),并设置定时器的预分频器和自动重装载值。
启动测量:当检测到PWM信号的上升沿或下降沿时,启动定时器开始计数。
记录时间:在PWM信号的另一个边缘(下降沿或上升沿)到来时,停止定时器并记录下定时器的计数值。这个计数值代表了PWM信号的一个电平(高或低)的时间长度。
重复测量:对于另一个电平,重复上述步骤。
计算周期和占空比:根据记录下的两个时间长度,可以计算出PWM信号的周期(两个时间长度之和)和占空比(高电平时间长度除以周期)。
2. 输入捕获法

使用特权

评论回复
20
averyleigh| | 2024-9-10 02:29 | 只看该作者
// 假设已经配置了定时器和中断
void TIMx_IRQHandler(void) {
    if(TIM_GetITStatus(TIMx, TIM_IT_CC1) != RESET){
        // 读取捕获值
        uint32_t highTime = TIM_GetCaptureValue(TIMx, TIM_CHANNEL_1);
        uint32_t lowTime = TIM_GetCaptureValue(TIMx, TIM_CHANNEL_2);

        // 计算周期和占空比
        uint32_t period = highTime + lowTime;
        float dutyCycle = (float)highTime / period;

        // 清除中断标志
        TIM_ClearITPendingBit(TIMx, TIM_IT_CC1);
    }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

200

主题

3544

帖子

16

粉丝