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

相关推荐
The Mr.Nobody36 分钟前
STM32MPU开发之旅:从零开始构建嵌入式Linux镜像
linux·stm32·嵌入式硬件
阿川!1 小时前
嵌入式软件--stm32 DAY 3
stm32·单片机·嵌入式硬件
#金毛2 小时前
STM32的定时器输出PWM时,死区时间(DTR)如何计算
stm32·单片机·嵌入式硬件
无脑学c++2 小时前
STM32串口重定向:MDK与GCC重定向需重写的不同函数
stm32·单片机·物联网
Invinciblenuonuo3 小时前
STM32八股【6】-----CortexM3的双堆栈(MSP、PSP)设计
stm32·单片机·嵌入式硬件
2401_888859714 小时前
STM32 TIM编码器接口
stm32·单片机·嵌入式硬件
【0931】4 小时前
51单片机中断
单片机·嵌入式硬件
学习噢学个屁5 小时前
基于51单片机的超声波液位测量与控制系统
c语言·单片机·嵌入式硬件·51单片机
电鱼智能的电小鱼6 小时前
EFISH-SBC-RK3588无人机地面基准站项目
linux·网络·嵌入式硬件·机器人·无人机·边缘计算
电鱼智能的电小鱼6 小时前
基于 EFISH-SBC-RK3588 的无人机环境感知与数据采集方案
linux·网络·嵌入式硬件·数码相机·无人机·边缘计算