当前位置: 首页 > news >正文

ESP 32控制无刷电机2

import machine
import time
import socket
import network
from machine import I2C, Pin, ADC

def start_ap():
    """
    启动ESP32的AP模式
    """
    ap = network.WLAN(network.AP_IF)
    ap.active(True)
    ssid = 'ESP32_APTest'
    password = '12345678'
    ap.config(essid=ssid, password=password)
    
    # 设置其他可选参数
    ap.config(authmode=3)  # WPA2-PSK加密
    ap.config(max_clients=10)  # 最大允许客户端连接数
    print('AP模式已启动')
    print('SSID:', ssid)
    print('IP地址:', ap.ifconfig()[0])


def start_udp():
    """
    初始化UDP套接字
    """
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udp_socket.bind(("0.0.0.0", 7788))  # 绑定端口7788
    udp_socket.setblocking(False)  # 设置为非阻塞模式
    print("UDP套接字已启动,端口:7788")
    return udp_socket


def read_voltage(adc, R1=10000, R2=4700, samples=100):
    """
    读取ADC平均值并计算分压后的电压值
    - 参数:
        - adc: ADC对象
        - R1: 分压电阻1 (默认10kΩ)
        - R2: 分压电阻2 (默认4.7kΩ)
        - samples: 采样数量 (默认100)
    - 返回值: 测量电压(单位: 伏)
    """
    try:
        total = 0
        for _ in range(samples):
            total += adc.read()
        adc_value = total / samples  # 平均ADC值
        divider_ratio = (R1 + R2) / R2  # 分压比
        voltage = (adc_value * 3.3 / 4095) * divider_ratio  # 转换为实际电压
        return round(voltage, 2)
    except Exception as e:
        print("读取电压时出错:", e)
        return 0.0


def main():
    """
    主程序
    """
    # 初始化ADC引脚
    adc = ADC(Pin(34))          # 使用GPIO34(ADC1通道6)
    adc.atten(ADC.ATTN_11DB)    # 设置衰减范围为11dB(量程0-3.6V)
    
    # 配置PWM参数
    pwm_pin = 14  # 根据实际硬件连接情况调整引脚编号
    pwm_freq = 500  # PWM频率设置为500Hz
    pwm = machine.PWM(machine.Pin(pwm_pin), freq=pwm_freq, duty=0)
    
    # 测试PWM输出
    pwm.duty(1023)
    time.sleep(2)
    pwm.duty(400)
    time.sleep(2)
    
    # 启动AP模式和UDP套接字
    start_ap()
    udp_socket = start_udp()
    
    print("系统已启动,等待UDP数据...")
    
    # 初始化计时器
    last_print_time = time.time()
    
    while True:
        try:
            # 尝试接收UDP数据(非阻塞)
            try:
                recv_data, sender_info = udp_socket.recvfrom(1024)  # 缓冲区大小为1024字节
                recv_data = recv_data.decode('utf-8').strip()  # 解码为字符串并去掉多余空白
                print(f"接收到数据: {recv_data} 来自 {sender_info}")
                
                # 读取电压
#                 vbat = read_voltage(adc) + 0.55  # 补偿+0.55V
#                 print(f"当前电压: {vbat} V")
                
                # 判断电压范围
#                 if vbat > 7.7:
                if recv_data.startswith('D') or recv_data.startswith('C'):
                        pwm.duty(0)  # 关闭PWM输出
                        print("指令接收,PWM关闭")
                else:
                        # 提取数值并设置PWM
                        if len(recv_data) >= 5:
                            raw_value_str = recv_data[1:5]  # 截取数值部分
                            try:
                                raw_value = int(raw_value_str)
                                value = raw_value // 2
                                if 500 <= value <= 1000:
                                    pwm.duty(value)
                                    print(f"设置PWM占空比为: {value}")
                                else:
                                    print("接收到的数值转换后不在500到1000的范围内")
                            except ValueError:
                                print("无法解析接收到的数值部分")
                        else:
                            print("接收到的数据长度不足")
#                 else:
#                     pwm.duty(0)  # 低电压时关闭PWM
#                     print("电压过低,PWM关闭")
            except OSError:
                # 如果没有数据到达,继续执行
                pass
        
        except Exception as e:
            print("主循环中发生错误:", e)
        
        # 每秒打印一次电压值
        current_time = time.time()
        if current_time - last_print_time >= 1:
            vbat = read_voltage(adc) + 0.55  # 补偿+0.55V
            print(f"abc当前电压: {vbat} V")
            if vbat < 7.0:
                pwm.duty(0)  # 低电压时关闭PWM
            last_print_time = current_time
        
        time.sleep(0.1)  # 避免循环过快


if __name__ == "__main__":
    main()

相关文章:

  • 【前端进阶】10 掌握前端框架模板引擎的实现原理
  • SpringBoot返回文件让前端下载的几种方式
  • CISP-PTE:kali常用命令
  • 用大白话解释搜索引擎Elasticsearch是什么,有什么用,怎么用
  • 软件测试丨Native应用性能分析与优化指南
  • 鹏信科技入选2024年网络安全技术应用典型案例项目名单
  • 【Pandas】pandas Series ffill
  • LeapVAD:通过认知感知和 Dual-Process 思维实现自动驾驶的飞跃
  • Web1、Web2 与 Web3 的核心区别
  • 解决 Excel 模板填充痛点:开发一款高效实用的工具
  • 数据链路层 ARP 具体过程 ARP 欺骗
  • jenkins使用不同用户管理不同工程
  • springcloud框架搭建
  • 【Git】版本控制系统Git命令详解
  • 【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.4.1Elasticsearch 7.x与8.x版本兼容性深度解析
  • 【人工智能】数据挖掘与应用题库(301-400)
  • 为什么IP报文从一个网络转发到另一个网络中MAC地址改变,IP地址不变?
  • 基于分数阶重复控制器的永磁同步电机转矩脉动抑制
  • 使用3090显卡部署Wan2.1生成视频
  • Spring系列学习之Spring Messaging消息支持
  • 内江市网站建设/长沙哪里有网站推广优化
  • 新乡网站推广/大型门户网站建设
  • 营销型集团网站建设/百度识图网页版
  • wordpress改企业网站/济南头条新闻热点
  • 宝安做网站的/网站优化费用报价明细
  • 维护网站费用/深圳宝安seo外包