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()

相关推荐
蜀黍@猿41 分钟前
【GD32】软件I2C
单片机·嵌入式硬件·mcu
小鱼儿电子1 小时前
18-基于STM32的智能医嘱手环设计与实现
stm32·单片机·物联网·医嘱手环
Chat_zhanggong3453 小时前
HI3516CV610-20S开发板
人工智能·嵌入式硬件·编辑器
不吃鱼的羊3 小时前
Vspy使用教程
单片机
小亮亮虫6 小时前
LwIP UDP RAW
单片机·网络协议·udp
仰望星空的凡人6 小时前
【BUG排查】基于RH850F1KMS1的主控出现系统中断错误,调试FEIC的值为0x11
单片机·bug·rh850·renesas
螺丝钉的扭矩一瞬间产生高能蛋白7 小时前
STM32电机控制基础知识
stm32·单片机·嵌入式硬件·嵌入式软件·直流有刷电机控制·定时器互补输出·定时器死区控制刹车输入
沐欣工作室_lvyiyi8 小时前
基于腾讯云的物联网导盲助手设计与实现(论文+源码)
单片机·物联网·云计算·毕业设计·腾讯云·导盲杖
Blossom.1188 小时前
用一颗MCU跑通7B大模型:RISC-V+SRAM极致量化实战
人工智能·python·单片机·嵌入式硬件·opencv·机器学习·risc-v
hazy1k9 小时前
K230基础-录放音频
人工智能·stm32·单片机·嵌入式硬件·音视频·k230