惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
A
About on SuperTechFans
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
W
WeLiveSecurity
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog
I
InfoQ
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Application and Cybersecurity Blog
Application and Cybersecurity Blog
雷峰网
雷峰网
Hacker News - Newest:
Hacker News - Newest: "LLM"
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Troy Hunt's Blog
S
SegmentFault 最新的问题
Help Net Security
Help Net Security
博客园_首页
博客园 - 叶小钗
O
OpenAI News
PCI Perspectives
PCI Perspectives
月光博客
月光博客
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
GbyAI
GbyAI
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
The Last Watchdog
The Last Watchdog
C
CXSECURITY Database RSS Feed - CXSecurity.com
有赞技术团队
有赞技术团队
D
Darknet – Hacking Tools, Hacker News & Cyber Security
腾讯CDC
Hacker News: Ask HN
Hacker News: Ask HN
I
Intezer
Y
Y Combinator Blog
阮一峰的网络日志
阮一峰的网络日志
Spread Privacy
Spread Privacy
T
Tailwind CSS Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
量子位
Cyberwarzone
Cyberwarzone
The Hacker News
The Hacker News
N
News and Events Feed by Topic
P
Proofpoint News Feed
Scott Helme
Scott Helme
D
Docker
Know Your Adversary
Know Your Adversary
Recent Commits to openclaw:main
Recent Commits to openclaw:main
TaoSecurity Blog
TaoSecurity Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tor Project blog

洛屿的小站

一种简单的卡尔曼滤波器设计 Cadence - 应律而动,落指成音 Zephyr - 聆风之息,为你而奏 不改一行插件代码,实现消息优先级与阻断 洛玖定时任务系统 在 butterfly 主题中添加首页点集动画(基于p2line项目) 你好,2026 stm32f4xx-ad9854并行驱动 主动式网站状态监测实现及其应用 右键菜单加入用Trae打开文件和文件夹 三角洲行动ID映射表 洛玖SDK说明 为网页文章开头添加原文连接 Hexo-Butterfly主题在主页添加GitHub贡献日历 Proteus中555定时器仿真问题 装饰器 洛玖开发日记 STS3032舵机获取力矩输出 kotlin网页前后端那些事 mspm0g3507-ad9850 奇怪的bug Paddle模型转PaddleLite 人工智能考核 构建一个yolov3网络 yolo和paddle模型常见输出参数 PaddleDetection 随便写的一些东西 实验室C语言第一次考核题目讲解及相关代码解读 C语言神经网络房价预测系统 C、C++数组,指针,指针数组,数组指针的区别 C、C++的大括号是必须的部分吗? C、C++预处理详解 C、C++其他关键字详解 C、C++存储类型关键字详解 C、C++控制语句关键字详解 C、C++数据类型关键字详解 C、C++关键字 C++药品管理系统 Bi-LSTM(Attention)的PyTorch实现 C语言实现波士顿房价预测 easy库的使用 edgeboardFZ3A相关问题 Predict.py的编写 Paddle环境搭建 百度Paddle模型训练 GMD09601-0.96OLED显示屏 【LeetCode 1617】统计子树中城市之间最大距离 C语言学习相关 STM32阵列按键 CH32(F10X F20X) 最短路 拓扑排序
stm32f4xx-ads1256驱动
洛屿 · 2025-08-28 · via 洛屿的小站
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//***************************
// Pin assign
// STM32f407 ADS1256
// GPIOA_Pin_3 <--- DRDY
// GPIOA_Pin_1 ---> CS
// GPIOA_Pin_5 ---> SCK
// GPIOA_Pin_6(MISO) <--- DOUT
// GPIOA_Pin_7(MOSI) ---> DIN
//***************************

#include "ads1256.h"
#define ADS1256_GPIO GPIOA
#define ADS1256_DRDY GPIO_PIN_3
#define ADS1256_CS GPIO_PIN_1

extern SPI_HandleTypeDef hspi1;

//-----------------------------------------------------------------//
// 功 能: SPI通信
// 入口参数: / 发送的SPI数据
// 出口参数: / 接收的SPI数据
// 全局变量: /
// 备 注: 发送接收函数
//-----------------------------------------------------------------//
unsigned char SPI_WriteByte(unsigned char TxData)
{
unsigned char RxData=0;
HAL_SPI_TransmitReceive(&hspi1, &TxData, &RxData, 1, 10);
return RxData;
}

//-----------------------------------------------------------------//
// 功 能:ADS1256 写数据
// 入口参数: /
// 出口参数: /
// 全局变量: /
// 备 注: 向ADS1256中地址为regaddr的寄存器写入一个字节databyte
//-----------------------------------------------------------------//
void ADS1256WREG(unsigned char regaddr,unsigned char databyte) //ADS1256WREG(ADS1256_MUX,channel); //设置通道
{
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
// CS_0();
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1) {}
//当ADS1256_DRDY为低时才能写寄存器
//向寄存器写入数据地址
SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));
//写入数据的个数n-1
SPI_WriteByte(0x00);
//向regaddr地址指向的寄存器写入数据databyte
SPI_WriteByte(databyte);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
}

//初始化ADS1256
float ADS1256_GAIN = 1.0f;
void ADS1256_Init(uint8_t gain) {
//*************自校准****************
// while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
// HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
// SPI_WriteByte(ADS1256_CMD_SELFCAL);
// while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
// HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
//**********************************

// ADS1256WREG(ADS1256_STATUS,0x06); // 高位在前、使用缓冲
ADS1256WREG(ADS1256_STATUS,0x04); // 高位在前、不使用缓冲

ADS1256WREG(ADS1256_MUX,0x08); // 初始化端口A0为‘+’,AINCOM位‘-’
if(gain == ADS1256_GAIN_1) ADS1256_GAIN = 1.0f; // 放大倍数1 ±5V
if(gain == ADS1256_GAIN_2) ADS1256_GAIN = 2.0f; // 放大倍数2 ±2.5V
if(gain == ADS1256_GAIN_4) ADS1256_GAIN = 4.0f; // 放大倍数4 ±1.25V
if(gain == ADS1256_GAIN_8) ADS1256_GAIN = 8.0f; // 放大倍数8 ±0.625V
if(gain == ADS1256_GAIN_16) ADS1256_GAIN = 16.0f; // 放大倍数16 ±0.3125V
if(gain == ADS1256_GAIN_32) ADS1256_GAIN = 32.0f; // 放大倍数32 ±0.15625V
if(gain == ADS1256_GAIN_64) ADS1256_GAIN = 64.0f; // 放大倍数64 ±0.078125V

ADS1256WREG(ADS1256_ADCON, gain); // 放大倍数8 ±0.625V

// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_1); // 放大倍数1 ±5V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_4); // 放大倍数4 ±1.25V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_8); // 放大倍数8 ±0.625V
// ADS1256WREG(ADS1256_ADCON,ADS1256_GAIN_16); // 放大倍数8 ±0.3125V
ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_1000SPS); // 数据10sps
ADS1256WREG(ADS1256_IO,0x00);

//*************自校准****************
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_SELFCAL);
while(HAL_GPIO_ReadPin (ADS1256_GPIO,ADS1256_DRDY)==1);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
//**********************************
}

// 微秒级延迟(纯循环)
void delay_us(uint32_t us) {
us *= 40; // 校准值(需根据实际测试调整)
while (us--) {
__asm__ volatile ("nop"); // 插入空指令确保循环不被优化
}
}

// 毫秒级延迟(基于delay_us)
void delay_ms(uint32_t ms) {
while (ms--) {
delay_us(1000);
}
}
//读取AD值
unsigned char pre_channel = 0;
int ADS1256ReadData(unsigned char channel) {
unsigned int sum=0;
while(HAL_GPIO_ReadPin(ADS1256_GPIO,ADS1256_DRDY)==1);//当ADS1256_DRDY为低时才能写寄存器
if (pre_channel != channel) {
pre_channel = channel;
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
ADS1256WREG(ADS1256_MUX,channel); //设置通道
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);

HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_SYNC);
SPI_WriteByte(ADS1256_CMD_WAKEUP);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);
while (HAL_GPIO_ReadPin(ADS1256_GPIO, ADS1256_DRDY) == 1);
}

HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_RESET);
SPI_WriteByte(ADS1256_CMD_RDATA);
// HAL_Delay(1);
delay_us(10);

sum |= (SPI_WriteByte(0xff) << 16);
sum |= (SPI_WriteByte(0xff) << 8);
sum |= SPI_WriteByte(0xff);
HAL_GPIO_WritePin(ADS1256_GPIO, ADS1256_CS, GPIO_PIN_SET);

if (sum>0x7FFFFF) // if MSB=1,
{
sum -= 0x1000000; // do 2's complement

}
return sum;
}

double ADS1256ReadVoltage(unsigned char channel) {
double voltage = ADS1256ReadData(channel)*(double)0.000000598;
voltage /= ADS1256_GAIN;
return voltage;
}