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

相关推荐
编程墨客11 小时前
STM32F103C8T6单片机内部执行原理及启动流程详解
stm32·单片机·嵌入式硬件
Wangshanjie_9812 小时前
【STM32】-SPI通讯
stm32
qq_4112624213 小时前
整体无需占用任何硬件 UART,即可新增一条全双工软串口
单片机·嵌入式硬件
XINVRY-FPGA15 小时前
XCZU47DR-2FFVG1517I Xilinx FPGA AMD ZynqUltraScale+ RFSoC
人工智能·嵌入式硬件·fpga开发·信息与通信·信号处理·射频工程·fpga
Cyrus_柯15 小时前
单片机基础(STM32-DAY2(GPIO))
单片机·嵌入式硬件
吃货界的硬件攻城狮15 小时前
【STM32 学习笔记】SPI通信协议
笔记·stm32·学习
努力的小帅16 小时前
STM32单片机_3
stm32·单片机·嵌入式硬件·学习·stm32c8t6
逼子格16 小时前
开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记
嵌入式硬件·硬件工程·硬件工程师·开关电源·multisim电路仿真·稳压电源·线性电源
SKYDROID云卓小助手17 小时前
无人设备遥控器之无线电频率篇
服务器·网络·单片机·嵌入式硬件·算法
逼子格19 小时前
振荡电路Multisim电路仿真实验汇总——硬件工程师笔记
笔记·嵌入式硬件·硬件工程·硬件工程师·硬件工程师真题·multisim电路仿真·震荡电流