21、STM32定时器PWM输入与CAN总线技术解析

STM32定时器PWM输入与CAN总线技术解析

1. STM32定时器PWM输入配置

在STM32的应用中,定时器可以用来测量PWM信号的周期和脉冲宽度。以下是详细的配置步骤:
1. 数字输入滤波器设置
- 代码第62行建立一个数字输入滤波器,对内部时钟信号(经过定时器的预分频器后)进行2分频采样。
- 第63行设置数字滤波器时钟不进行预分频。
2. 计数器清零配置 :第64行指定当PB6输入信号上升(TI1)时,计数器应清零。清零操作在寄存器TIM4_CCR1加载计数器捕获值之后进行,这可以测量重复周期的时长。
3. 第二触发设置 :第65行设置定时器2的第二个触发条件,当PB6输入信号下降到低电平时,定时器的当前计数值将被复制到捕获寄存器TIM4_CCR2,从而测量脉冲宽度。
4. 捕获配置 :第66 - 68行配置两个捕获配置:
- 启用捕获输入1(TIM_CCER_CC1E),默认高电平有效。
- 启用捕获输入2(TIM_CCER_CC2E),低电平有效(TIM_CCER_CC2P)。由于目前没有libopencm3例程,所以使用了宏名称。
5. 输入和中断启用 :第69和70行启用定时器4的两个输入,第71行启用定时器4输入1和2的中断,第72行启动定时器4计数器。

以下是相关代码示例:

// 定时器配置代码片段
// 数字输入滤波器设置
// ... 第62行代码
// ... 第63行代码
// 计数器清零配置
// ... 第64行代码
// 第二触发设置
// ... 第65行代码
// 捕获配置
// ... 第66 - 68行代码
// 输入和中断启用
// ... 第69 - 72行代码
2. 任务循环与数据报告

定时器启动后,任务进入一个循环,代码如下:

// task1 Demo Loop
static volatile uint32_t cc1if = 0, cc2if = 0,
    c1count = 0, c2count = 0;
for (;;) {
    vTaskDelay(1000);
    gpio_toggle(GPIOC,GPIO13);
    std_printf("cc1if=%u (%u), cc2if=%u (%u)\n",
        (unsigned)cc1if,(unsigned)c1count,
        (unsigned)cc2if,(unsigned)c2count);
}

循环中,每隔一秒进行一次延时(vTaskDelay(1000)),然后切换PC13上的LED状态,最后报告一些感兴趣的值:
- CC1IF是周期结束时的计数器值,来自寄存器TIM4_CCR1,括号内的值是ISR例程被调用的次数,用于表示周期的时长。
- CC2IF是输入信号从高电平下降到低电平时捕获的计数器值,代表脉冲宽度,括号内同样是ISR计数。

3. ISR例程

主循环使用的值由定时器的ISR例程更新,代码如下:

// Timer ISR Routine
void tim4_isr(void) {
    uint32_t sr = TIM_SR(TIM4);
    if ( sr & TIM_SR_CC1IF ) {
        cc1if = TIM_CCR1(TIM4);
        ++c1count;
        timer_clear_flag(TIM4,TIM_SR_CC1IF);
    }
    if ( sr & TIM_SR_CC2IF ) {
        cc2if = TIM_CCR2(TIM4);
        ++c2count;
        timer_clear_flag(TIM4,TIM_SR_CC2IF);
    }
}

当ISR例程被调用时,首先读取定时器状态寄存器(第24行)。如果是捕获1事件触发的中断(第26行),则捕获计数值(第27行),递增ISR计数器(第28行),并清除中断标志(第29行)。捕获2事件的处理类似。

4. 演示运行

演示过程包括将伺服遥控器接收器连接到GPIO PB6(支持+5V电压),烧录代码,并通过USB运行minicom。具体步骤如下:
1. 软件准备
- $ make clobber
- $ make
- $ make flash
2. 硬件连接 :建议使用电阻R1进行保护,防止信号冲突时电流过大。
3. 运行测试 :插入USB电缆,启动minicom:
- $ minicom usb

运行后,会输出类似以下的结果:

cc1if=25174 (176), cc2if=985 (176)
cc1if=25119 (215), cc2if=989 (215)
...
5. 定时器输入原理

输入信号从GPIO PB6进入定时器输入通道1(TI1),经过数字滤波器(由配置位IC1F控制)处理,防止噪声干扰。信号TI1F进入边缘检测器,产生内部信号TI1F_Rising和TI1F_Falling。配置项CC1P选择信号极性,当TI1FP1信号触发时,定时器的计数值将被复制到捕获1寄存器,捕获后计数器复位。

输入通道2(IC2)的信号来源于通道1采样的信号,配置项CC2S使通道1的信号替代正常的TI2输入,用于捕获不同事件。由于IC2是下降沿极性,因此可以捕获信号下降时的计数值,从而测量脉冲宽度。

以下是定时器输入配置的流程图:

graph TD;
    A[GPIO PB6输入信号] --> B[数字滤波器IC1F];
    B --> C[边缘检测器];
    C --> D[TI1F_Rising和TI1F_Falling];
    D --> E[CC1P选择极性];
    E --> F[捕获1寄存器];
    F --> G[计数器复位];
    D --> H[CC2S选择通道];
    H --> I[捕获2寄存器];
6. CAN总线概述

CAN总线(控制器区域网络)于1983年由Robert Bosch GmbH开发,旨在标准化组件之间的通信。此前,汽车ECU(发动机控制单元)采用各自的专有系统,需要大量点对点布线。1986年,Bosch在SAE大会上发布了CAN协议,1991年发布CAN 2.0协议,并于1993年成为国际标准(ISO 11898)。此后,汽车开始使用该协议进行通信,减少了线束尺寸。

7. CAN总线优势

在汽车应用中,使用CAN总线可以减少线束的复杂性。传统上,汽车通过车身作为电池返回电流的负极来减少布线,但负载控制需要为每个负载单独布线。而采用总线系统,每个控制单元连接到同一总线上发送消息,只需要以下线路:
- 电源线(+12V)
- 一条或一对总线信号线
- 电源负极返回路径(车身)

这种配置允许任何控制单元与其他控制单元通信,例如位于车辆后部的控制单元CU3可以根据总线上的消息控制后部的灯泡。虽然目前汽车可能不会用这种方式控制刹车和信号灯,但技术上是可行的。

8. 差分信号与逻辑状态

CAN总线使用差分信号进行高速通信,具有抗噪声能力。信号的活跃状态称为主导逻辑电平,此时CAN H接近+5V,CAN L接近0V。逻辑状态由CAN H和CAN L的差值(Vdiff)决定。为防止信号反射,高速线性总线两端需用120Ω电阻端接。

CAN总线信号有隐性和显性两种形式:
- 隐性信号是信号的松弛状态,差分信号通过电阻网络达到空闲状态,单端驱动信号通过上拉电阻达到高电平。
- 显性信号通过晶体管从静止状态驱动到活跃状态,差分总线信号中,CAN H由高端晶体管拉高,CAN L由低端晶体管拉低;驱动信号由导通的低端晶体管拉低。

以下是总线仲裁的真值表:
| Driver 1 | Driver 2 | Bus Result | Description |
| — | — | — | — |
| Recessive | Recessive | Recessive | 总线空闲 |
| Dominant | Recessive | Dominant | 主导状态 |
| Recessive | Dominant | Dominant | 主导状态 |
| Dominant | Dominant | Dominant | 主导状态 |

9. 总线仲裁与同步

在多主设备的CAN总线中,需要进行仲裁以确定哪个设备可以发送消息。仲裁过程如下:
1. 多个设备同时发送消息ID。
2. 比较消息ID的位,主导位(0)优先于隐性位(1)。
3. 如果某个设备发送的隐性位被总线上的主导位覆盖,则该设备失去仲裁,停止发送消息。

在消息传输前,会发送一个SOF位(帧起始位),这是一个主导位,用于同步所有设备的时钟。消息ID的长度根据协议版本为11位或29位,仲裁过程根据消息ID的主导位确定优先级。

10. 消息格式

CAN总线的消息格式包含多个字段:
- RTR(远程传输请求):用于请求远程设备传输数据,隐性位表示设备的响应,此时不使用DLC字段,也不发送数据。
- IDE(标识符扩展位):标识是否使用扩展ID消息格式,本章演示使用11位格式,用主导位表示。
- DLC(数据长度代码):表示非RTR响应中的数据长度(字节),其后跟随相应数量的数据字节。
- CRC(循环冗余校验):用于检测消息是否损坏。
- ACK(确认位):发送时为隐性位,若有设备成功接收消息且CRC校验无误,会在该位时间内将总线拉到主导状态,通知发送者消息已成功接收。

以下是CAN总线消息传输的流程图:

graph TD;
    A[发送SOF位] --> B[发送消息ID];
    B --> C[仲裁过程];
    C --> D{是否获胜};
    D -- 是 --> E[发送数据帧];
    E --> F[发送CRC字段];
    F --> G[发送ACK位];
    G --> H{是否收到确认};
    H -- 是 --> I[传输成功];
    H -- 否 --> J[传输失败];
    D -- 否 --> K[取消传输];

综上所述,STM32定时器可以轻松测量PWM信号的脉冲宽度和周期,而CAN总线为设备间的通信提供了高效、可靠的解决方案。这些技术在汽车、控制等领域具有广泛的应用前景。

STM32定时器PWM输入与CAN总线技术解析

11. STM32定时器PWM输入的应用优势

STM32定时器在PWM输入测量方面展现出了显著的优势。在实际应用中,通过上述的配置和操作,仅需执行少量的中断(如每秒仅39 x 2次中断)就能精确捕获信号的周期和脉冲宽度。这使得ISR代码非常简洁,能够为CPU节省大量的宝贵时间,让CPU可以将更多的资源投入到其他有价值的工作中。

例如,在一些对实时性要求较高的系统中,如工业自动化控制、机器人控制等领域,精确测量PWM信号的周期和脉冲宽度是至关重要的。通过STM32定时器的高效测量,系统可以根据这些精确的数据及时调整控制策略,从而提高系统的稳定性和可靠性。

12. CAN总线在不同领域的应用潜力

CAN总线作为一种标准化的通信协议,其应用范围远远不止于汽车领域。除了汽车的发动机控制、电子设备通信等应用外,在模型飞机、无人机和模型铁路系统等领域也具有巨大的应用潜力。

  • 模型飞机和无人机 :在模型飞机和无人机中,各个模块(如电机控制器、传感器等)之间需要进行高效、可靠的通信。CAN总线的高速通信能力和抗干扰性能能够确保这些模块之间的数据传输准确无误,从而提高模型飞机和无人机的飞行稳定性和安全性。
  • 模型铁路系统 :在模型铁路系统中,需要对列车的运行状态、轨道的信号等进行实时监测和控制。CAN总线可以实现各个控制单元之间的通信,使得列车的运行更加智能化和自动化。
13. 技术拓展与深入探索

虽然本文详细介绍了STM32定时器PWM输入和CAN总线的基本原理和应用,但实际上还有许多其他的特性和功能值得进一步探索。

对于STM32定时器,除了本文介绍的PWM输入测量功能外,还可以实现PWM输出、定时器计数等多种功能。读者可以深入研究STM32的参考手册,了解更多关于定时器的高级应用。

对于CAN总线,除了基本的通信协议和仲裁机制外,还可以探索CAN FD(Flexible Data Rate)等扩展协议,这些协议可以提供更高的数据传输速率和更大的数据长度,满足一些对数据传输要求更高的应用场景。

14. 实际应用中的注意事项

在实际应用中,无论是使用STM32定时器进行PWM输入测量,还是使用CAN总线进行通信,都需要注意一些事项。

  • STM32定时器PWM输入 :在硬件连接方面,要确保输入信号的稳定性和可靠性,避免信号干扰和噪声的影响。在软件配置方面,要根据实际需求合理设置定时器的参数,如预分频器、捕获配置等。
  • CAN总线通信 :在硬件设计方面,要注意总线的端接电阻的选择和连接,确保信号的反射得到有效抑制。在软件编程方面,要处理好仲裁机制和同步问题,确保各个设备之间的通信协调一致。
15. 总结与展望

STM32定时器PWM输入和CAN总线技术为电子设备的开发和应用提供了强大的支持。通过精确测量PWM信号的脉冲宽度和周期,以及实现设备间的高效通信,这些技术可以广泛应用于汽车、工业控制、航空航天等多个领域。

未来,随着科技的不断发展,这些技术也将不断演进和完善。例如,STM32定时器可能会具备更高的精度和更多的功能,CAN总线可能会支持更高的数据传输速率和更复杂的通信协议。相信在不久的将来,这些技术将在更多的领域发挥重要作用,为人们的生活和工作带来更多的便利和创新。

以下是一个总结表格,对比了STM32定时器PWM输入和CAN总线的关键信息:
| 技术类型 | 功能 | 应用领域 | 关键配置 | 注意事项 |
| — | — | — | — | — |
| STM32定时器PWM输入 | 测量PWM信号的周期和脉冲宽度 | 工业自动化、机器人控制等 | 数字输入滤波器设置、计数器清零配置、捕获配置等 | 硬件连接稳定性、软件参数设置合理性 |
| CAN总线 | 设备间的通信 | 汽车、模型飞机、无人机等 | 差分信号设置、总线仲裁、同步等 | 总线端接电阻、仲裁和同步处理 |

为了更直观地展示整个系统的工作流程,下面是一个综合的mermaid流程图:

graph LR;
    A[STM32定时器PWM输入] --> B[测量周期和脉冲宽度];
    B --> C[数据处理与应用];
    D[CAN总线通信] --> E[设备间消息传输];
    E --> F[仲裁与同步];
    F --> G[消息确认与反馈];
    C --> H[与CAN总线系统交互];
    G --> H;
    H --> I[系统整体控制与应用];

通过这个流程图,可以清晰地看到STM32定时器PWM输入和CAN总线通信在整个系统中的协同工作过程,以及它们如何共同为系统的整体控制和应用提供支持。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值