乐鑫技术交流
直播中

djelje

8年用户 1029经验值
擅长:光电显示
私信 关注
[问答]

ESP32S2使用定时器开启AD采集,并通过TCP发送出去遇到的疑问求解

如题,使用ESP32S2做了一个小设备,计划实现功能如下:
1、电脑分享AP并开启TCP服务端,ESP32S2上电后通过WiFi Sta模式连接到AP并建立TCP连接。
2、电脑端通过TCP发送开启测量命令
3、接收到命令后,ESP32S2开启定时器1及中断,在中断中进行AD采集。

程序的编写基本参考官方examples中的TCP Client、ADC1及timerGroup例程。基本逻辑如下:
1、串口、ADC1、WiFi Sta、TCP Client、定时器等初始化,其中在定时器初始化中设置中断。
2、创建tcp_receive_task,接收到开始指令则开启定时器中断、接收到停止指令则关闭定时器中断。
3、在定时器中断回调函数中,为保证中断函数处理速度,仅设置二值信号量用来同步任务。
4、创建ad_measure_task任务,等待二值信号量开启任务,任务使用adc1_get_raw()函数获取ADC结果。


问题现象:
接收到TCP传来的开启指令,开启定时器后,通过串口打印出大量的“phy :”错误 phy: pll_cap_ext 10。这个错误代码我百度了一下,没太明白什么意思。

若在ad_measure_task任务中屏蔽adc1_get_raw()函数,则不会出错。
若屏蔽WIFI、TCP的初始化开启,通过串口接收开启定时器任务,也不会出错。
不屏蔽WIFI的时候,通过串口接收开启定时器任务,也会出错,但报错次数明显降低。

实在是查不出来原因啊,难道   定时器1、ADC1、WIFI三者有某种什么神秘力量的联系吗????????我查手册,仅说明了ADC2与WIFI有冲突,ADC1应该没问题啊~~~求大佬们解答~~~谢谢啦。

错误一般发生后会以高频形式串口记录如下:
(21461) phy: pll_cap_ext 10[0m
[0;32mI (21471) phy: pll_cap_ext 10[0m
[0;32mI (21471) phy: pll_cap_ext 10[0m
[0;32mI (21481) phy: pll_cap_ext 10[0m
[0;32mI (21481) phy: pll_cap_ext 10[0m
[0;32mI (21481) phy: pll_cap_ext 10[0m
[0;32mI (21491) phy: pll_cap_ext 10[0m
[0;32mI (21491) phy: pll_cap_ext 10[0m
[0;32mI (21491) phy: pll_cap_ext 10[0m
[0;32mI (21501) phy: pll_cap_ext 10[0m
[0;32mI (21501) phy: pll_cap_ext 10[0m
[0;32mI (21501) phy: pll_cap_ext 10[0m
[0;32mI (21511) phy: pll_cap_ext 10[0m
[0;32mI (21511) phy: pll_cap_ext 10[0m
[0;32mI (21521) phy: pll_cap_ext 10[0m
[0;32mI (21521) phy: pll_cap_ext 10[0m
[0;32mI (21521) phy: pll_cap_ext 10[0m
[0;32mI (21531) phy: pll_cap_ext 10[0m
[0;32mI (21531) phy: pll_cap_ext 10[0m
[0;32mI (21531) phy: pll_cap_ext 10[0m
[0;32mI (21541) phy: pll_cap_ext 10[0m
[0;32mI (21541) phy: pll_cap_ext 10[0m
[0;32mI (21551) phy: pll_cap_ext 10[0m
[0;32mI (21551) phy: pll_cap_ext 10[0m
[0;32mI (21551) phy: pll_cap_ext 10[0m
[0;32mI (21561) phy: pll_cap_ext 10[0m
                                                                                                                                                                    

回帖(1)

任凭风吹

2024-6-13 16:38:51
根据您提供的信息,您已经实现了以下功能:

1. 电脑分享AP并开启TCP服务端,ESP32S2通过WiFi Sta模式连接到AP并建立TCP连接。
2. 电脑端通过TCP发送开启测量命令。
3. 接收到命令后,ESP32S2开启定时器1及中断,在中断中进行AD采集。

接下来,我将为您提供一些建议和可能遇到的问题的解决方案:

1. 确保ESP32S2的ADC通道已正确配置。在初始化ADC1时,请确保选择了正确的ADC通道和分辨率。

2. 在TCP客户端接收到开始测量命令后,确保正确地启动定时器中断。您可以使用`timer_group_set_alarm`函数设置定时器的触发时间,并使用`timer_group_enable_alarm`函数启用定时器中断。

3. 在定时器中断服务程序中,使用`adc1_get_raw`函数读取ADC值。确保在读取ADC值之前,已经正确地初始化了ADC1。

4. 将读取到的ADC值转换为实际电压值。您可以使用ESP32S2的参考电压(例如1.1V)来计算实际电压值。

5. 将转换后的电压值通过TCP发送到电脑端。您可以使用`esp_tcp_write`函数将数据发送到TCP连接。

6. 如果需要停止测量,确保在TCP客户端接收到停止命令后,正确地关闭定时器中断。您可以使用`timer_group_disable_alarm`函数禁用定时器中断。

7. 确保在程序中添加必要的错误处理和异常处理,以便在遇到问题时能够及时地进行处理。

8. 在调试过程中,使用串口打印关键信息,以便更好地了解程序的运行情况。

9. 如果遇到连接问题,请检查ESP32S2的WiFi配置是否正确,并确保电脑端的TCP服务端能够正确地接收和发送数据。

10. 最后,确保您的程序具有良好的可读性和可维护性,以便在后续开发中能够快速地进行修改和扩展。

希望这些建议对您有所帮助。如果您在实现过程中遇到任何问题,请随时提问,我会尽力为您提供帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分