Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
外部中断
10
关于RTT使用ADS1256和AD7606采集频率的问题
发布于 2024-07-24 08:55:35 浏览:332
订阅该版
[tocm] 各位论坛的大佬们,大家好,我当前遇到的问题如下请求大佬们指导 ## 1. 硬件环境: STM32F407ZGT6+RTT+ADS156,准备位移传感器的0~5V的电压输出采样。 ## 2. 当前状态: 目前配置ADS1256的增益和数据输出速率分别为PGA_1和1K,我自己加了IIR滤波,使用外部中断触发,SPI读取的方式,在1K采样率下所采集的数据稳定正常,如下图所示。 ## 3. 当前遇到的问题: 现在想提高ADS1256的采样率,当我配置数据输出速率分别为2K的时候,运行正常,当配置为2K以上的数据输出速率的时候发现单片机无法正常运行,怀疑CPU一直在中断中。 ## 4.想跟大家讨论的问题: 4.1. 想提高提高ADS1256的采样率的方法是不是选择主频更改的MCU,其次是否有其他软件优化方案SPI+DMA?,各位大佬是否有遇到类似的问题。 ## 类似的问题: 使用AD7606如果使用FMC+外部中断的方式当提高采样率也会遇到CPU无法正常运行,一直处理中断。 求各位大佬指点,赐教。 ![微信图片_20240723182124.png](https://oss-club.rt-thread.org/uploads/20240724/40d43e23110ad677f4942980cfc4fa86.png.webp)
查看更多
3
个回答
默认排序
按发布时间排序
踩姑娘的小蘑菇
2024-07-24
这家伙很懒,什么也没写!
2k中断频率,中断处理只有500us,同时要完成spi读取,软件IIR的开销也不低 - spi+dma应该会有改善 - 有高频中断的应用不适合上rtos,裸机中断是最快的 - F4可以把fpu配上试试
xiaorui
认证专家
2024-07-24
小睿手办 https://item.taobao.com/item.htm?id=674889867009
逻辑分析仪接上中断和SPI信号,然后实际抓一下,情况就会明朗很多。
Dev_XH
2024-07-25
每天进步一点点,发际线后移一点点
感谢各位老师的回复,我把IIR滤波和数据处理放到线程中,开启了FPU,选择单通道连续读取,SPI配置如下: ```c SPI1_Handler.Instance = SPI1; // SPI1 SPI1_Handler.Init.Mode = SPI_MODE_MASTER; // 设置SPI工作模式,设置为主模式 SPI1_Handler.Init.Direction = SPI_DIRECTION_2LINES; // 设置SPI单向或者双向的数据模式:SPI设置为双线模式 SPI1_Handler.Init.DataSize = SPI_DATASIZE_8BIT; // 设置SPI的数据大小:SPI发送接收8位帧结构 SPI1_Handler.Init.CLKPolarity = SPI_POLARITY_LOW; // 串行同步时钟的空闲状态为高电平 SPI1_Handler.Init.CLKPhase = SPI_PHASE_2EDGE; // 串行同步时钟的第二个跳变沿(上升或下降)数据被采样 SPI1_Handler.Init.NSS = SPI_NSS_SOFT; // NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制 SPI1_Handler.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; // 256分频(2K~3.75K)、 128分频(7.5K~15K)、32分频(30K) SPI1_Handler.Init.FirstBit = SPI_FIRSTBIT_MSB; // 指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始 SPI1_Handler.Init.TIMode = SPI_TIMODE_DISABLE; // 关闭TI模式 SPI1_Handler.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // 关闭硬件CRC校验 SPI1_Handler.Init.CRCPolynomial = 7; // CRC值计算的多项式 HAL_SPI_Init(&SPI1_Handler); // 初始化 ``` 当我配置SPI分频为256分频(支持2K~3.75K)、 128分频(支持7.5K~15K)、32分频(支持30K) ADS1256中断处理函数如下: ```c void ADS1256_ISR(void) { // ADS1256_SetChannal(0); // 切换模拟通道 // rt_thread_delay(250); // ADS1256_WriteCmd(CMD_SYNC); // rt_thread_delay(250); // ADS1256_WriteCmd(CMD_WAKEUP); // rt_thread_delay(250); // AdcNow[0] = ADS1256_ReadData(); // 注意保存的是上一个通道的数据 adc[0] = ADS1256_ReadData(); // 注意保存的是上一个通道的数据 // adc[0] = (int32_t)ADS1256_GetAdc(0); // 从全局缓冲区读取采样结果。 采样结果是在中断服务程序中读取的 // adc_1[0] = (adc[0] & 0x7FFFFFFF); // 4194303 = 2.5V , 这是理论值,实际可以根据2.5V基准的实际值进行公式矫正 // if (adc[0] & 0x80000000) // { // volt[0] = (((((double)adc_1[0] * 5000) / 8374608)) - 5000); // 计算实际电压值(近似估算的),如需准确,请进行校准 MV // volt[0] = volt[0] / 1000; // 转换为V // distance[0] = (750 * volt[0]) / 5.0; // 距离=量程X采集电压值(V)÷5.0V(DAC供电电压) // } // else // { // volt[0] = ((((double)adc_1[0] * 5000) / 8414608)); // 计算实际电压值(近似估算的),如需准确,请进行校准 MV // volt[0] = volt[0] / 1000; // 转换为V // distance[0] = 750 - ((750 * volt[0]) / 5.0); // 反距离=总量程-量程X采集电压值(V)÷5.0V(DAC供电电压) // } // iir_distance_value = lowPassFilter(distance[0], &iir_distance); // writeToBuffer(&distance_sb, iir_distance_value); // // printBuffer(&distance_sb); // speed = distance_sb.buffer[4] - distance_sb.buffer[0]; // // rt_kprintf("%3.3f - %3.3f = %3.3f\r\n", distance_sb.buffer[4], distance_sb.buffer[0], speed); // iir_speed_value = lowPassFilter(speed, &iir_speed); // writeToBuffer(&speed_sb, iir_speed_value); // // printBuffer(&speed_sb); // a_speed = speed_sb.buffer[4] - speed_sb.buffer[0]; // iir_a_speed_value = lowPassFilter(a_speed, &iir_a_speed); // // v_count += 1; // // if (v_count == count_number) // // { // // speed = iir_distance_value - point_1_p; // // iir_speed_value = lowPassFilter(speed, &iir_speed); // // a_speed = iir_speed_value - point_1_v; // // iir_a_speed_value = lowPassFilter(a_speed, &iir_a_speed); // // point_1_p = iir_distance_value; // // point_1_v = iir_a_speed_value; // // v_count = 1; // // } // if (report_switch) // { // rt_kprintf("%3.6f,%3.6f,%3.6f,%3.6f,%d,%3.6f,%3.6f\n", distance[0], iir_distance_value, speed, iir_speed_value, pin_status, a_speed, iir_a_speed_value); // // rt_kprintf("%3.6f,%3.6f,%3.6f,%3.6f,%3.6f,%d,%3.6f,%3.6f\n", volt[0], distance[0], iir_distance_value, speed, iir_speed_value, pin_status, a_speed, iir_a_speed_value); // } // if (point_1_status == 1) // 1号点位速度、位置更新 // { // if (volt[0] <= depth) // { // count += 1; // point_1_status = 2; // pin_status = 0; // HAL_GPIO_WritePin(OUTPUT1_GPIO, OUTPUT1_GPIO_PIN, GPIO_PIN_RESET); // } // } // else if (point_1_status == 2) // { // if (volt[0] >= 4.98) // { // if (count == 1) // { // point_1_status = 0; // count = 0; // // time_t now; /* 保存获取的当前时间值 */ // // now = time(RT_NULL); /* 获取时间 */ // // rt_kprintf("End time of ascent:%s\r\n", ctime(&now)); /* 打印输出时间信息 */ // // rt_kprintf("loop end count:%d %s\r\n", count); // } // else // { // // point_1_motion = 0; // // time_t now; /* 保存获取的当前时间值 */ // // now = time(RT_NULL); /* 获取时间 */ // // rt_kprintf("End time of ascent:%s\r\n", ctime(&now)); /* 打印输出时间信息 */ // // point_1_status = 1; // pin_status = 1; // HAL_GPIO_WritePin(OUTPUT1_GPIO, OUTPUT1_GPIO_PIN, GPIO_PIN_SET); // } // } // } } ``` 当我配置SPI分频为32分频、单通道读取、去除中断里浮点计算和串口打印后,ADS1256的数据输出频率可支持30KHz。
撰写答案
登录
注册新账号
关注者
0
被浏览
332
关于作者
Dev_XH
每天进步一点点,发际线后移一点点
提问
7
回答
9
被采纳
0
关注TA
发私信
相关问题
1
外部中断中能改变外部中断的功能,作为普通管脚用吗
2
外部中断计数输入的脉冲
3
关于4.0.2版本中STM32的PIN设备外部中断的相关问题
4
外部中断问题,现在开机上电前几次不能用,后面就可以了
5
我用外部中断接收数据,接收的时序非常严谨,现在是一次可以一次不行
6
外部中断我接收数据一次可以一次不行,我中断优先级设置最高了,是还有中断干扰吗?
7
使用外部中断释放信号量,在线程里接收数据,一次成功一次失败,这个代码有问题吗?
8
配置的GPIO中断无法执行中断服务子程序
9
增加系统,引脚为上升沿触发,触发中断,进入到中断时间延时10us,系统会干扰吗
10
rt 1052 触摸屏 INT 中断
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部