一、CS1237簡(jiǎn)介
CS1237是一款高精度、低功耗Sigma-Delta模數(shù)轉(zhuǎn)換芯片,內(nèi)置一路Sigma-Delta ADC,一路差分輸入通道和一路溫度傳感器,ADC采用兩階sigma delta 調(diào)制器,通過低噪聲儀用放大器結(jié)構(gòu)實(shí)現(xiàn)PGA放大,放大倍數(shù)可選:1、2、64、128。在PGA=128時(shí),有效分辨率可達(dá)20位(工作在5V)。 CS1237內(nèi)置RC振蕩器,無需外置晶振。
CS1237可以通過DOUT DRDY/和SCLK進(jìn)行多種功能模式的配置,例如用作溫度檢測(cè)、PGA選擇、ADC數(shù)據(jù)輸出速率選擇等等。 具有Power down模式。
主要特性
- 供電電壓:3.3 / 5V
- 內(nèi)置晶振
- 集成溫度傳感器
- 帶Power down功能
- 2線SPI接口,最快速率為1.1MHz
ADC功能特性:
- 24位無失碼
- PGA放大倍數(shù)可選:1、2、64、128
- 1路24位無失碼的差分輸入,在PGA=128時(shí)ENOB為20位(5V) 19.5位(3.3V)
- P-P噪聲:PGA=128、10Hz:180nV;
- INL小于0.0015%
- 輸出速率可選:10Hz、40Hz、640Hz、1.28kHz
- 帶內(nèi)短功能
應(yīng)用場(chǎng)景
- 工業(yè)過程控制
- 電子秤
- 液體/氣體化學(xué)分析
- 血液計(jì)
- 智能變換器
- 便攜式設(shè)備

二、引腳說明
| DVDD | 電源正極(3 - 5V) |
|---|---|
| DGND | 電源負(fù)極 |
| AVDD | 基準(zhǔn)源輸入正 |
| AGND | 基準(zhǔn)源輸入負(fù) |
| SCLK | SPI時(shí)鐘輸入 |
| DOUT | SPI數(shù)據(jù)輸入/輸出 |
| A+ | 通道正輸入 |
| A- | 通道負(fù)輸入 |
基準(zhǔn)源輸入說明:基準(zhǔn)電壓可以由外部輸入也可是內(nèi)部輸出,如果要使用外部基準(zhǔn)電壓,要先關(guān)閉內(nèi)部基準(zhǔn),內(nèi)部基準(zhǔn)控制由寄存器(refo_off)控制。
三、讀寫時(shí)序和數(shù)據(jù)輸出格式說明

讀寫參數(shù)配置過程簡(jiǎn)述,在DOUT DRDY/由高變低之后:
- 第1個(gè)到第24個(gè)SCLK,讀取ADC數(shù)據(jù)。如果不需要配置寄存器或者讀取寄存器,可以省略下面的步驟。
- 第25個(gè)到第26個(gè)SCLK,讀取寄存器寫操作狀態(tài)。
- 第27個(gè)SCLK,把DOUT DRDY/輸出拉高。
- 第28個(gè)到第29個(gè)SCLK,切換DOUT DRDY/為輸入。
- 第30個(gè)到第36個(gè)SCLK,輸入寄存器寫或讀命令字?jǐn)?shù)據(jù)(高位先輸入)。
- 第37個(gè)SCLK,切換DOUT DRDY/的方向(如果是寫寄存器,DOUT DRDY/為輸入;如果是讀寄存器,DOUT DRDY/為輸出)。
- 第38個(gè)到第45個(gè)SCLK,輸入寄存器配置數(shù)據(jù)或輸出寄存器配置數(shù)據(jù)(高位先輸入/輸出)。
- 第46個(gè)SCLK,切換DOUT DRDY/為輸出,并把DOUT DRDY/拉高。update1/ update2被置位或清零。

讀數(shù)據(jù)
CS1237可以持續(xù)的轉(zhuǎn)換模擬輸入信號(hào),當(dāng)將DOUT DRDY/拉低后,表明數(shù)據(jù)已經(jīng)準(zhǔn)備好接受,輸入的第一個(gè)SCLK來就可以將輸出的最高位讀出,在24個(gè)SCLK后將所有的24位數(shù)據(jù)讀出,如果這時(shí)暫停SCLK的發(fā)送,DOUT DRDY/會(huì)保持著最后一位的數(shù)據(jù),直到其被拉高,第25和26個(gè)SCLK輸出配置寄存器是否有寫操作標(biāo)志,第25個(gè)SCLK對(duì)應(yīng)的DOUT DRDY/為1時(shí)表明配置寄存器Config被寫入了新的值,第26個(gè)SCLK對(duì)應(yīng)的DOUT DRDY/為芯片擴(kuò)展保留位,目前輸出一直為0,通過第27個(gè)SCLK可以將DOUT DRDY/拉高,此后當(dāng)DOUT DRDY/被再次拉低,表示新的數(shù)據(jù)已經(jīng)準(zhǔn)備好接受,進(jìn)行下一個(gè)數(shù)據(jù)的轉(zhuǎn)換。
數(shù)據(jù)輸出格式
CS1237輸出的數(shù)據(jù)為24位的2進(jìn)制補(bǔ)碼,最高位(MSB)最先輸出。最小有效位(LSB)為(0.5VREF/Gain)/(2^23-1)。正值滿幅輸出碼為7FFFFFH,負(fù)值滿幅輸出碼為800000H。下表為不同模擬輸入信號(hào)對(duì)應(yīng)的理想輸出碼。
根據(jù)上表可知,不同的增益,輸入信號(hào)Vin范圍也不同。
| PGA | VIN+ - VIN- |
|---|---|
| 1 | ±1.25V |
| 2 | ±0.625V |
| 64 | ±0.01953125V |
| 128 | ±0.009765625V |
注意:因?yàn)?CS1237 內(nèi)部的前置放大器和 Σ-Δ 調(diào)制器都需要一個(gè)共模電壓范圍 (Vcm),所以輸入信號(hào)要滿足以下三個(gè)條件,有一個(gè)條件不符合,輸出可能就會(huì)不正常。
差分電壓:|AIN+ - AIN-| ≤ Vref / 2 x Gain。
共模電壓:Vcm = (AIN+ + AIN-) / 2,Vcm最好接近Vref / 2。
AIN+,AIN-的輸入電壓:DGND ≤ AINx ≤ DVDD。
四、寄存器說明
讀寫參數(shù)配置,需要通過7bits 命令字去配置。
CS1237只有一組Config寄存器
五、電壓和溫度換算
電壓的換算:
CS1237 是 24 位ADC,輸出 24 位補(bǔ)碼格式的數(shù)據(jù),代表輸入的差分電壓:Vin(diff)?=AIN+ ? AIN?。
其輸出碼值范圍為:
正滿量程:理論輸出碼為+8,388,607 (0x7FFFFF),對(duì)應(yīng)輸入電壓為+Vref / 2x增益。
負(fù)滿量程:理論輸出碼為-8,388,608 (0x800000),對(duì)應(yīng)輸入電壓為-Vref / 2x增益。
即換算有符號(hào)的數(shù)據(jù)公式:Vin(diff)?=輸出碼值 / 2^23 x Vref / 2x增益。
溫度的換算:
測(cè)量?jī)?nèi)部溫度時(shí),需要先校準(zhǔn)再測(cè)量,芯片沒有出廠校準(zhǔn),必須用兩個(gè)已知溫度點(diǎn)進(jìn)行標(biāo)定。注意:測(cè)量溫度時(shí),AIN+、AIN- 對(duì)外引腳無效,即采集不了輸入信號(hào)。

六、STM32F103驅(qū)動(dòng)CS1237
準(zhǔn)備工作
STM32F103C8T6最小系統(tǒng)板,CS1237 ADC模數(shù)轉(zhuǎn)換模塊,OLED顯示模塊等
接線說明
| STM32F103 | CS1237 |
|---|---|
| 3.3V | DVDD |
| GND | DGND |
| PA0 | SLCK |
| PA1 | DOUT |
| PB8 | OLED->SLC |
| PB9 | OLED->SDA |
| A + - A- | 差分信號(hào) |
示例代碼
CS1237.c
#include "cs1237.h"
void CS1237_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
}
void CS1237_DOUT_Input(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void CS1237_DOUT_Output(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
int8_t CS1237_WirteByte(uint8_t data) //寫配置
{
uint8_t i;
uint32_t t=0;
CS1237_DOUT_Input();
while (DOUT_READ != 0) //超時(shí)
{
if((t += 5) > CS1237_DEFAULT_TIMEOUT_US)
return -1;
}
for (i = 0; i < 26; i++) { //1-26 SCLK
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
}
CS1237_DOUT_Output(); //27 SCLK
CS1237_DOUT_H
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
for (i = 0; i < 2; i++) { //28-29 SCLK
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
}
for (i = 0; i < 7; i++) { //30-36 SCLK
if (CS1237_WRITE_REG & (0x40 > > i)) CS1237_DOUT_H
else CS1237_DOUT_L
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
}
CS1237_SCLK_H //37 SCLK
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
for (i = 0; i < 8; i++) { //38-45 SCLK
if (data & (0x80 > > i)) CS1237_DOUT_H
else CS1237_DOUT_L
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
}
CS1237_DOUT_H
CS1237_DOUT_Input(); //46 SCLK
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
return 0;
}
int8_t CS1237Reg(uint8_t *out) //讀配置
{
uint8_t i;
uint32_t t=0;
uint8_t Data = 0x00;
CS1237_DOUT_Input();
while (DOUT_READ != 0) //超時(shí)
{
if((t += 5) > CS1237_DEFAULT_TIMEOUT_US)
return -1;
}
for (i = 0; i < 26; i++) { //1-26 SCLK
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
}
CS1237_DOUT_Output();
CS1237_DOUT_H
CS1237_SCLK_H //27 SCLK
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
for (i = 0; i < 2; i++) { //28-29 SCLK
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
}
for (i = 0; i < 7; i++) { //30-36 SCLK
if (CS1237_READ_REG & (0x40 > > i)) CS1237_DOUT_H
else CS1237_DOUT_L
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
}
CS1237_DOUT_Input(); //37 SCLK
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
for (i = 0; i < 8; i++) { //38-45 SCLK
CS1237_SCLK_H
Delay_us(2);
Data = ((Data < < 1) | (DOUT_READ ? 1 : 0));
CS1237_SCLK_L
Delay_us(2);
}
CS1237_DOUT_Output();
CS1237_DOUT_H
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
*out = Data;
return 0;
}
int8_t CS1237_ReadRaw24(int32_t *signed_out)
{
uint8_t i;
uint32_t raw = 0;
uint32_t t = 0;
CS1237_DOUT_Input();
while (DOUT_READ != 0) //超時(shí)
{
Delay_us(2);
if((t += 10) > CS1237_DEFAULT_TIMEOUT_US)
return -1;
}
for (i = 0; i < 24; i++) {
CS1237_SCLK_H
Delay_us(2);
raw = (raw < < 1) | (DOUT_READ ? 1 : 0);
CS1237_SCLK_L
Delay_us(2);
}
for (i = 0; i < 2; i++) {
CS1237_SCLK_H
Delay_us(2);
CS1237_SCLK_L
Delay_us(2);
}
raw &= 0xFFFFFFUL;
if (raw & (1UL < < 23)) *signed_out = (int32_t)(raw | 0xFF000000UL);
else *signed_out = (int32_t)raw;
return 0;
}
float CS1237_Temperature(uint32_t Yb)
{
int8_t error;
float tempB;
error = CS1237_WirteByte(0x02);
if(error != 0) OLED_ShowString(4, 1, "ERROR3");
tempB = ((float)Yb * (273.15f + CS1237_TEMPA)) / ((float)CS1237_YA - 273.15f); //單位℃
return tempB;
}
main.c
#include "stm32f10x.h"
#include "delay.h"
#include "oled.h"
#include "cs1237.h"
uint8_t status;
int32_t val;
float diff_V, Temp;
uint8_t gain_table[4] = {1, 2, 64, 128}; //設(shè)置不同增益,輸入差分范圍也不一樣,1:±1.25V;2:±0.625V;64:±0.01953125V;128:±0.009765625V
int main(void)
{
OLED_Init();
CS1237_Init();
Delay_ms(100);
OLED_ShowString(1, 1, "CS1237");
OLED_ShowString(3, 4, "000.000V");
// OLED_ShowString(4, 4, "0000.00"); //溫度顯示
CS1237_WirteByte(0x00);
Delay_ms(100);
if(CS1237Reg(&status) == 0)
{
OLED_ShowString(1, 10, "0x");
OLED_ShowHexNum(1,12,status,2);
}else{
OLED_ShowString(1, 10, "ERROR1");
}
while (1)
{
if (CS1237_ReadRaw24(&val) == 0) {
// OLED_ShowSignedNum(4,1,val,7);
//
diff_V = ((float)val / 8388607.0f) * (1.25f / (float)gain_table[(status >>2) & 0x03]);
OLED_ShowSignedFloat(3,4,diff_V,2,3);
Delay_ms(100);
} else {
OLED_ShowString(3,4," ERROR2 ");
}
//溫度檢測(cè)
// Temp = CS1237_Temperature(val);
// OLED_ShowSignedFloat(4,4,Temp,3,2);
// Delay_ms(100);
}
}
效果展示
圖一:A+接1.2V,A-接1.496V;圖二:A+接1.815V,A-接1.2V。
七、常見問題說明
Q:CS1237/CS1238 主要適用領(lǐng)域有哪些?
A:CS1237/CS1238是針對(duì)橋式傳感器的低成本解決方案。一般應(yīng)用于稱重測(cè)量、壓力測(cè)量等細(xì)分領(lǐng)域。如下圖所示:
Q:除了橋式傳感器,CS1237/CS1238 還適用于其它應(yīng)用領(lǐng)域嗎?
A:取決于 AINP/AINN 端口的差分信號(hào)范圍以及共模電壓范圍是否滿足 Datasheet 的要求。如下圖所示:
Q:CS1237/CS1238 是否有單次轉(zhuǎn)換模式?
A:否。CS1237/CS1238 只有連續(xù)轉(zhuǎn)換模式。
Q:CS1237/CS1238 是否可以單端輸入模式(AINN 接地)?
A:如問題 2 所述,輸入信號(hào)需要滿足共模與差模范圍,一般情況下不建議單端輸入的應(yīng)用使用該系列產(chǎn)品。當(dāng) PGA=64/128 時(shí),不允許 AINP 或 AINN 直接接地,否則測(cè)量信號(hào)異常;當(dāng)PGA=1/2 時(shí),由于 Buffer 開啟的緣故,單端輸入阻抗不宜太大(建議前端電路的輸出阻抗幾十歐姆以下),否則會(huì)影響線性。
Q:CS1237/CS1238 的工作電壓范圍是多少?為什么數(shù)據(jù)手冊(cè)里面描述 4.5-5.5V、3.0V-3.6V 的?
A: 1、工作電壓范圍是 2.7V~5.5V。
2、數(shù)據(jù)手冊(cè)描述的是兩個(gè)典型電壓值(5V/3.3V)的工作電流,并不是只能工作在這兩個(gè)電壓區(qū)間。
Q:CS1237/CS1238 上電默認(rèn)配置是什么?
A:上電默認(rèn)配置是 PGA=128、DataRate=10Hz。
Q:CS1237/CS1238 的外置參考電壓是否可以高于 VDD?
A:不可以。外置參考電壓需滿足條件:REFIN=1.5V~VDD。舉例:橋式傳感器的應(yīng)用不允許傳感器激勵(lì)源以及參考輸入使用 5.0V,而 VDD 使用 3.3V。
Q:在橋式傳感器應(yīng)用里,為什么 REFIN 與 REFOUT 連在一起?
A:使用傳感器的激勵(lì)源作為 ADC 的參考源,(橋式傳感器應(yīng)用)可以有效抑制漂移,降低系統(tǒng)對(duì)參考源的要求。其中 REFIN 為參考源輸入,REFOUT 為傳感器激勵(lì)源。對(duì)于一般應(yīng)用,兩者通常連在一起,可以通過 REFOUT 引腳控制激勵(lì)源的開啟/關(guān)閉。如果系統(tǒng)使用外部激勵(lì)源/參考源,則懸空 REFOUT 引腳即可,因此并不規(guī)定 REFIN 引腳必須與REFOUT 引腳連在一起。
Q:CS1237/CS1238 是否內(nèi)置參考電壓源?
A:否。CS1237/CS1238 的 REFOUT 引腳輸出的激勵(lì)信號(hào)為 VDD,起到控制激勵(lì)源的作用。如有必要可以進(jìn)入休眠模式,關(guān)閉激勵(lì)源節(jié)省橋式傳感器功耗。如下圖所示:
Q:實(shí)際應(yīng)用中,多個(gè)稱重傳感器應(yīng)該怎么與 ADC 連接?
A:如果傳感器是測(cè)量同一物體(例如:廚房垃圾處理器),一般建議使用并聯(lián)的方式。則相同類型的信號(hào)線連接在一起。對(duì)于傳感器的要求是產(chǎn)品規(guī)格盡量一致,尤其是靈敏度需要一致,否則會(huì)導(dǎo)致偏載問題。如果使用 REFOUT 引腳輸出 VS,需要注意傳感器的激勵(lì)電流是否在合理范圍內(nèi)。舉例:
如果系統(tǒng)不是測(cè)量同一個(gè)物體,則傳感器單獨(dú)連接不同的模擬通道或不同的 ADC。
最后,如需源碼,點(diǎn)贊收藏+關(guān)注,評(píng)論留言?。?!
審核編輯 黃宇
-
adc
+關(guān)注
關(guān)注
100文章
7506瀏覽量
555632 -
差分信號(hào)
+關(guān)注
關(guān)注
4文章
408瀏覽量
28979 -
STM32F103
+關(guān)注
關(guān)注
34文章
494瀏覽量
67626 -
模數(shù)轉(zhuǎn)換模塊
+關(guān)注
關(guān)注
0文章
2瀏覽量
1314 -
cs1237
+關(guān)注
關(guān)注
2文章
7瀏覽量
6539
發(fā)布評(píng)論請(qǐng)先 登錄
CS1237/CS1239 問題集
CS1237模數(shù)轉(zhuǎn)換值百位跳動(dòng)
CS1237
基于CS1237的電子秤應(yīng)用設(shè)計(jì)
提供CS1237芯片 深圳鼎盛合科技代理芯海CS1237芯片
芯海芯片CS1237分享 深圳鼎盛合提供電子秤芯片CS1237
cs1237自校零問題
你好,我正在使用stm32F103測(cè)試CS1237,有相關(guān)完善的驅(qū)動(dòng)或者示例代碼嗎?
CS1237引腳圖及功能
CS1237驅(qū)動(dòng)程序參考代碼
樹莓派開發(fā)ADC芯片CS1237(C語(yǔ)言和python庫(kù)開發(fā))
基于STM32F103驅(qū)動(dòng)CS1237 ADC模數(shù)轉(zhuǎn)換模塊采集差分信號(hào)
評(píng)論