『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 1187|回复: 14

[求助] 有大佬知道ESPHome如何输出50Hz的SPWM信号驱动H桥吗??

[复制链接]
回帖奖励 8 金钱 回复本帖可获得 2 金钱奖励! 每人限 5 次

50

主题

1306

帖子

4984

积分

论坛DIY达人

积分
4984
金钱
3678
HASS币
20
发表于 2023-6-25 20:19:54 | 显示全部楼层 |阅读模式
本帖最后由 sorrypqa 于 2023-7-2 15:17 编辑

到目前为止玩炸了2个H桥驱动芯片和1个DC-DC模块.........................


玩个破风扇https://bbs.hassbian.com/thread-21631-1-1.html,捣鼓了好几天,一直不知道怎么让ESP32连接H桥驱动芯片的2个脚输出50Hz的SPWM或方波信号来驱动风扇摇头的爪极式永磁同步电机
连接方式类似下图:


SNAG-2023-6-25_00000.png

ESPHome组件有点发神经,speed组件(风扇主电机)和hbridge组件(扫风用同步电机)竟然互相干扰,打开同步电机时会让风扇主电机的的频率也变成50Hz,调整风速时同步电机频率也跟着变,怀疑是同PWM通道互相影响,但像下面一样在output:里指定风扇主电机用通道1,H桥电机用通道2的话,会全部无法工作


fan: #速度风扇组件
  - platform: speed
    id: Variable_speed_fan
    output: speed_fan_template
    name: "${friendly_name}_fan"
    speed_count: 10 #设置速度级别的数量,该值用于计算每个速度的百分比,同时允许输出中的增量为 1%
    restore_mode: ALWAYS_OFF #启动时将风扇初始化为OFF。
#    oscillation_output: osc_template ##摇头开关
#    direction_output: osc_template ##正反转开关可并在一起.在hk中显示在一起/out输出根据需要修改.本例子指向了同功
    on_speed_set: #每次更改风扇速度时激活此触发器
      - lambda: !lambda |-
          if (id(Variable_speed_fan).speed == 2) {
          }

    on_turn_off: #关闭风扇时激活此触发器
      - then:
        - output.turn_off: power_led
        - output.turn_off: speed1_led
        - output.turn_off: speed2_led
        - output.turn_off: speed3_led
        - fan.turn_off: oscillation_out
    on_turn_on: #每次打开激活此触发器
      then:
        - output.turn_on: power_led
#      - lambda: !lambda |-

#---------------- #H桥电机----------------------
  - platform: hbridge
    id: oscillation_out
    name: "${friendly_name}_osc" #风扇的名称
    pin_a: motor_forward #连接到H桥引脚A的输出的ID。
    pin_b: motor_reverse #连接到H桥引脚B的输出的ID。
    speed_count: 10
    # enable_pin: motor_enable #连接到H桥的使能引脚的浮点输出的ID(如果H桥使用使能)。
    decay_mode: slow #要与h桥一起使用的衰减模式
#    restore_mode: ALWAYS_OFF #启动时将风扇初始化为OFF。
    on_turn_on:
      then:
          - output.ledc.set_frequency:
              id: motor_forward
              frequency: "50Hz"
          - output.set_level:
              id: motor_forward
              level: "50%"
          - output.ledc.set_frequency:
              id: motor_reverse
              frequency: "50Hz"
          - output.set_level:
              id: motor_reverse
              level: "50%"
          - output.turn_on: osc_led
    on_turn_off:
      then:
          - output.turn_off: osc_led

output:
  - platform: ledc
    pin: $fan_pin
    id: fan_out
    channel: 1

  - platform: ledc
    pin: $osc1_pin #H桥输出引脚
    id: motor_forward
    channel: 2

  - platform: ledc
    pin: $osc2_pin #H桥输出引脚
    id: motor_reverse
    channel: 2
  - platform: template #模板输出
    id: speed_fan_template
    type: float #输出的类型
    write_action: #在更新输出状态时要执行的自动化。
      - if:
          condition:
            lambda: return ((state == 0)); #调节位置比例
          then:
            - output.turn_off: fan_out
            - output.turn_off: speed1_led
            - output.turn_off: speed2_led
            - output.turn_off: speed3_led
      - if:
          condition:
            lambda: return ((state > 0) && (state < 0.1));
          then:
            - output.turn_on: fan_out
            - output.turn_on: speed1_led
            - output.turn_off: speed2_led
            - output.turn_off: speed3_led
            - output.ledc.set_frequency:
                  id: fan_out
                  frequency: "80Hz"
            - output.set_level:
                  id: fan_out
                  level: "50%"
      - if:
          condition:
            lambda: return ((state > 0.1) && (state < 0.2));
          then:
            - output.turn_on: fan_out
            - output.turn_on: speed1_led
            - output.turn_off: speed2_led
            - output.turn_off: speed3_led
            - output.ledc.set_frequency:
                  id: fan_out
                  frequency: "100Hz"
            - output.set_level:
                  id: fan_out
                  level: "50%"
      - if:
          condition:
            lambda: return ((state > 0.2) && (state < 0.3));
          then:
            - output.turn_on: fan_out
            - output.turn_off: speed1_led
            - output.turn_off: speed3_led
            - output.turn_on: speed2_led
            - output.ledc.set_frequency:
                  id: fan_out
                  frequency: "120Hz"
            - output.set_level:
                  id: fan_out
                  level: "50%"
      - if:
          condition:
            lambda: return ((state > 0.3) && (state < 0.4));
          then:
            - output.turn_on: fan_out
            - output.turn_off: speed1_led
            - output.turn_off: speed3_led
            - output.turn_on: speed2_led
            - output.ledc.set_frequency:
                  id: fan_out
                  frequency: "140Hz"
            - output.set_level:
                  id: fan_out
                  level: "50%"






回复

使用道具 举报

102

主题

2894

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
11585
金钱
8626
HASS币
460

教程狂人突出贡献

发表于 2023-6-25 20:38:40 | 显示全部楼层

回帖奖励 +2 金钱

回复

使用道具 举报

50

主题

1306

帖子

4984

积分

论坛DIY达人

积分
4984
金钱
3678
HASS币
20
 楼主| 发表于 2023-6-25 20:46:35 | 显示全部楼层
XCray 发表于 2023-6-25 20:38
这个?
https://esphome.io/components/stepper/index.html

这个只能使用A4988来驱动4线步进电机,我那个是用H桥的2线电机,不适合用。
回复

使用道具 举报

1

主题

54

帖子

719

积分

高级会员

Rank: 4

积分
719
金钱
665
HASS币
0
发表于 2023-6-25 22:31:04 | 显示全部楼层

回帖奖励 +2 金钱

回复

使用道具 举报

50

主题

1306

帖子

4984

积分

论坛DIY达人

积分
4984
金钱
3678
HASS币
20
 楼主| 发表于 2023-6-25 22:49:20 | 显示全部楼层
xuchida 发表于 2023-6-25 22:31
https://esphome.io/components/fan/hbridge.html
这是H桥的代码

我用了,但不知道怎么输出10KHz的PMW信号呀
回复

使用道具 举报

4

主题

88

帖子

1958

积分

论坛技术达人

积分
1958
金钱
1865
HASS币
20
发表于 2023-6-26 00:43:50 | 显示全部楼层

回帖奖励 +2 金钱

速度风扇的oscillation_output,设置为模板输出ID,在模板输出中的write_action中,设置ledc的频率和占空比即可,不需要重新定义一个H桥的风扇组件,仅供参考。理论可行。
回复

使用道具 举报

50

主题

1306

帖子

4984

积分

论坛DIY达人

积分
4984
金钱
3678
HASS币
20
 楼主| 发表于 2023-6-26 07:14:43 | 显示全部楼层
zxl_hass 发表于 2023-6-26 00:43
速度风扇的oscillation_output,设置为模板输出ID,在模板输出中的write_action中,设置ledc的频率和占空比 ...

这样只有一个引脚输出吧?但这个鬼电机需要正反交替变换的电流来驱动,就需要2个引脚输出交替变换的方波信号给H桥驱动芯片
回复

使用道具 举报

4

主题

88

帖子

1958

积分

论坛技术达人

积分
1958
金钱
1865
HASS币
20
发表于 2023-6-26 09:02:07 | 显示全部楼层

回帖奖励 +2 金钱

本帖最后由 zxl_hass 于 2023-6-26 09:06 编辑
sorrypqa 发表于 2023-6-26 07:14
这样只有一个引脚输出吧?但这个鬼电机需要正反交替变换的电流来驱动,就需要2个引脚输出交替变换的方波 ...

H桥不支持你这种电机,一般的2线直流电机都是碳刷换向的。你可以直接给个直流电看看电机转不转就完了
回复

使用道具 举报

50

主题

1306

帖子

4984

积分

论坛DIY达人

积分
4984
金钱
3678
HASS币
20
 楼主| 发表于 2023-6-26 10:14:55 | 显示全部楼层
本帖最后由 sorrypqa 于 2023-6-26 11:16 编辑
zxl_hass 发表于 2023-6-26 09:02
H桥不支持你这种电机,一般的2线直流电机都是碳刷换向的。你可以直接给个直流电看看电机转不转就完了 ...

显示是24V交流电机的,我用下面这个设置可以让H桥输出指定频率信号了,奇怪的是,风扇变速时,H桥的输出频率也变成风扇的频率,而且占空比也变了,不知怎么回事,


20230626_100915.jpg


fan: #速度风扇组件
  - platform: speed
    id: Variable_speed_fan
    output: speed_fan_template
    name: "${friendly_name}_fan"
    speed_count: 10 #设置速度级别的数量,该值用于计算每个速度的百分比,同时允许输出中的增量为 1%
    restore_mode: ALWAYS_OFF #启动时将风扇初始化为OFF。
#    oscillation_output: osc_template ##摇头开关
#    direction_output: osc_template ##正反转开关可并在一起.在hk中显示在一起/out输出根据需要修改.本例子指向了同功
    on_speed_set: #每次更改风扇速度时激活此触发器
      - lambda: !lambda |-
          if (id(Variable_speed_fan).speed == 2) {
          }

    on_turn_off: #关闭风扇时激活此触发器
      - then:
        - output.turn_off: power_led
        - output.turn_off: speed1_led
        - output.turn_off: speed2_led
        - output.turn_off: speed3_led
    on_turn_on: #每次打开激活此触发器
      then:
        - output.turn_on: power_led
#      - lambda: !lambda |-

#---------------- #H桥电机----------------------
  - platform: hbridge
    id: oscillation_out
    name: "${friendly_name}_osc" #风扇的名称
    pin_a: motor_forward_pin #连接到H桥引脚A的输出的ID。
    pin_b: motor_reverse_pin #连接到H桥引脚B的输出的ID。
    speed_count: 1
    # enable_pin: motor_enable #连接到H桥的使能引脚的浮点输出的ID(如果H桥使用使能)。
    decay_mode: slow #要与h桥一起使用的衰减模式
    restore_mode: ALWAYS_OFF #启动时将风扇初始化为OFF。
    on_turn_on:
      then:
        - output.turn_on: osc_template

output:
  - platform: ledc
    pin: $fan_pin
    id: fan_out

  - platform: ledc
    pin: $osc1_pin
    id: motor_forward_pin

  - platform: ledc
    pin: $osc2_pin
    id: motor_reverse_pin

  - platform: template #模板输出
    id: osc_template
    type: float #输出的类型
    write_action: #在更新输出状态时要执行的自动化。
      then:
        - output.turn_on: motor_forward_pin
        - output.turn_on: motor_reverse_pin
        - output.ledc.set_frequency:
            id: motor_forward_pin
            frequency: "500Hz"
        - output.set_level:
            id: motor_forward_pin
            level: "50%"






文档里有提到通道问题,不知这两组模板输出是不是共用一组通道造成的,但又不知道怎样手动设置通道
https://esphome.io/components/output/ledc.html


SNAG-2023-6-26_0000.png


------------------------最终使用以下设置可以独立正常开关H桥输出了,缺点是oscillation_output无法使用H桥,而且H桥组件是可调占空比的,无法固定50%占空比,也许会编程的话,写自定义输出组件才完美-------------------


fan: #速度风扇组件
  - platform: speed
    id: Variable_speed_fan
    output: speed_fan_template
    name: "${friendly_name}_fan"
    speed_count: 10 #设置速度级别的数量,该值用于计算每个速度的百分比,同时允许输出中的增量为 1%
    restore_mode: ALWAYS_OFF #启动时将风扇初始化为OFF。
#    oscillation_output: osc_template ##摇头开关
#    direction_output: osc_template ##正反转开关可并在一起.在hk中显示在一起/out输出根据需要修改.本例子指向了同功
    on_speed_set: #每次更改风扇速度时激活此触发器
      - lambda: !lambda |-
          if (id(Variable_speed_fan).speed == 2) {
          }

    on_turn_off: #关闭风扇时激活此触发器
      - then:
        - output.turn_off: power_led
        - output.turn_off: speed1_led
        - output.turn_off: speed2_led
        - output.turn_off: speed3_led
        - fan.turn_off: oscillation_out
    on_turn_on: #每次打开激活此触发器
      then:
        - output.turn_on: power_led
#      - lambda: !lambda |-

#---------------- #H桥电机----------------------
  - platform: hbridge
    id: oscillation_out
    name: "${friendly_name}_osc" #风扇的名称
    pin_a: motor_forward_pin #连接到H桥引脚A的输出的ID。
    pin_b: motor_reverse_pin #连接到H桥引脚B的输出的ID。
    speed_count: 10
    # enable_pin: motor_enable #连接到H桥的使能引脚的浮点输出的ID(如果H桥使用使能)。
    decay_mode: slow #要与h桥一起使用的衰减模式
    restore_mode: ALWAYS_OFF #启动时将风扇初始化为OFF。
    on_turn_on:
      then:

output:
  - platform: ledc
    pin: $fan_pin
    id: fan_out
#    channel: 1

  - platform: ledc
    pin: $osc1_pin #H桥输出引脚
    id: motor_forward_pin
    frequency: "50Hz"
#    channel: 3

  - platform: ledc
    pin: $osc2_pin #H桥输出引脚
    id: motor_reverse_pin
    frequency: "50Hz"
#    channel: 3

  - platform: template #模板输出
    id: speed_fan_template
    type: float #输出的类型
    write_action: #在更新输出状态时要执行的自动化。
      - if:
          condition:
            lambda: return ((state == 0)); #调节位置比例
          then:
            - output.turn_off: fan_out
            - output.turn_off: speed1_led
            - output.turn_off: speed2_led
            - output.turn_off: speed3_led
      - if:






回复

使用道具 举报

4

主题

88

帖子

1958

积分

论坛技术达人

积分
1958
金钱
1865
HASS币
20
发表于 2023-6-26 11:15:07 | 显示全部楼层

回帖奖励 +2 金钱

sorrypqa 发表于 2023-6-26 10:14
显示是24V交流电机的,我用下面这个设置可以让H桥输出指定频率信号了,奇怪的是,风扇变速时,H桥的输出频 ...

你看下esphome源码就明白了,https://github.com/esphome/espho ... fan/hbridge_fan.cpp
是通过设置占空比来控制转速的,同时只有一个引脚输出pwm,另外一个引脚输出高电平。ledc默认频率是1000,也可以在定义时设置频率。

想设置通道,直接在ledc那里直接定义就好了。
个人建议,如果你用H桥可以驱动摇头电机,那就自己通过oscillation_output,的模板来设置ledc,控制是否控制摇头,摇头的速度。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-14 06:55 , Processed in 0.273327 second(s), 36 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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