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