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

相关推荐
国科安芯3 小时前
AS32A601与ASM1042芯片在电力系统自动化监控中的应用效能分析
单片机·物联网·自动化
才鲸嵌入式8 小时前
C++相比于C语言增加了哪些概念?
c语言·c++·单片机·嵌入式·arm·面向对象·软件
dujunqiu11 小时前
S32DS上进行S32K328的时钟配置,LPUART时钟配置步骤详解
单片机·mcu
Peter_Deng.13 小时前
单片机 - STM32F407 ADC 模式详解:单次转换、连续转换、扫描模式、非扫描模式
stm32·单片机·嵌入式硬件
iFulling14 小时前
【单片机】51单片机练习代码
单片机·嵌入式硬件·51单片机
华普微HOPERF16 小时前
让温度“说话”,数字温度传感器如何智能感知温度?
科技·单片机·嵌入式硬件·物联网·智能家居
iCxhust16 小时前
PC16550 UART接收中断处理完整示例代码
c语言·开发语言·stm32·单片机·嵌入式硬件
NEWEVA__zzera2216 小时前
记录存储的使用
经验分享·单片机
iFulling17 小时前
【单片机】51单片机学习笔记
单片机·学习·51单片机
YONYON-R&D18 小时前
STM32L431中,低功耗模式下的仿真调试功能受到限制
单片机·嵌入式硬件