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

相关推荐
深圳市九鼎创展科技9 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计9 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦10 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报10 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业10 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能11 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn11 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响11 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
qq_6725927511 小时前
电源芯片为什么发热
单片机·嵌入式硬件
天天爱吃肉821811 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车