實(shí)物照片
模塊簡(jiǎn)介
HX711是一款專為高精度稱重傳感器而設(shè)計(jì)的24位A/D轉(zhuǎn)換器芯片。與同類型其它芯片相比,該芯片集成了包括穩(wěn)壓電源、片內(nèi)時(shí)鐘振蕩器等其它同類型芯片所需要的外圍電路,具有集成度高、響應(yīng)速度快、抗干擾性強(qiáng)等優(yōu)點(diǎn)。降低了電子秤的整機(jī)成本,提高了整機(jī)的性能和可靠性。該芯片與后端MCU芯片的接口和編程非常簡(jiǎn)單,所有控制信號(hào)由管腳驅(qū)動(dòng),無需對(duì)芯片內(nèi)部的寄存器編程。輸入選擇開關(guān)可任意選取通道A或通道B,與其內(nèi)部的低噪聲可編程放大器相連。通道A的可編程增益為128或64,對(duì)應(yīng)的滿額度差分輸入信號(hào)幅值分別為±20mV或±40mV。通道B則為固定的32增益,用于系統(tǒng)參數(shù)檢測(cè)。芯片內(nèi)提供的穩(wěn)壓電源可以直接向外部傳感器和芯片內(nèi)的A/D轉(zhuǎn)換器提供電源,系統(tǒng)板上無需另外的模擬電源。芯片內(nèi)的時(shí)鐘振蕩器不需要任何外接器件。上電自動(dòng)復(fù)位功能簡(jiǎn)化了開機(jī)的初始化過程。
模塊特點(diǎn)
- 兩路可選擇差分輸入
- 片內(nèi)低噪聲可編程放大器,可選增益為64 和128
- 片內(nèi)穩(wěn)壓電路可直接向外部傳感器和芯片內(nèi)A/D 轉(zhuǎn)換器提供電源
- 片內(nèi)時(shí)鐘振蕩器無需任何外接器件,必要時(shí)也可使用外接晶振或時(shí)鐘
- 上電自動(dòng)復(fù)位電路
- 簡(jiǎn)單的數(shù)字控制和串口通訊:所有控制由管腳輸入,芯片內(nèi)寄存器無需編程
- 可選擇10Hz 或80Hz 的輸出數(shù)據(jù)速率
- 同步抑制50Hz 和60Hz 的電源干擾
- 耗電量(含穩(wěn)壓電源電路):典型工作電流:<1.7mA, 斷電電流:<1μA
- 工作電壓范圍:2.6 ~ 5.5V
- 工作溫度范圍:-20 ~ +85℃
- 16 管腳的SOP-16 封裝
硬件
HX711 內(nèi)部方框圖
在protues中 如下圖
管腳說明如下圖:
模擬輸入
通道A模擬差分輸入可直接與橋式傳感器的差分輸出相接。由于橋式傳感器輸出的信號(hào)較小,為了充分利用A/D轉(zhuǎn)換器的輸入動(dòng)態(tài)范圍,該通道的可編程增益較大,為128或64。這些增益所對(duì)應(yīng)的滿量程差分輸入電壓分別±20mV或±40mV。通道B為固定的32增益,所對(duì)應(yīng)的滿量程差分輸入電壓為±80mV。通道B應(yīng)用于包括電池在內(nèi)的系統(tǒng)參數(shù)檢測(cè)。
供電電源
數(shù)字電源(DVDD)應(yīng)使用與MCU芯片相同的的數(shù)字供電電源。HX711芯片內(nèi)的穩(wěn)壓電路可同時(shí)向A/D轉(zhuǎn)換器和外部傳感器提供模擬電源。穩(wěn)壓電源的供電電壓(VSUP)可與數(shù)字電源(DVDD)相同。穩(wěn)壓電源的輸出電壓值(VAVDD)由外部分壓電阻R1、R2 和芯片的輸出參考電壓 VBG決定(圖1),VAVDD=VBG(R1+R2)/R2。應(yīng)選擇該輸出電壓比穩(wěn)壓電源的輸入電壓(VSUP)低至少100mV。如果不使用芯片內(nèi)的穩(wěn)壓電路,管腳VSUP和管腳AVDD應(yīng)相連,并接到電壓為2.6~5.5V的低噪聲模擬電源。管腳VBG上不需要外接電容,管腳VFB應(yīng)接地,管腳BASE 為無連接。
時(shí)鐘選擇
如果將管腳XI接地,HX711將自動(dòng)選擇使用內(nèi)部時(shí)鐘振蕩器,并自動(dòng)關(guān)閉外部時(shí)鐘輸入和晶振的相關(guān)電路。這種情況下,典型輸出數(shù)據(jù)速率為10Hz或80Hz。如果需要準(zhǔn)確的輸出數(shù)據(jù)速率,可將外部輸入時(shí)鐘通過一個(gè)20pF的隔直電容連接到XI管腳上,或?qū)⒕д襁B接到XI和XO管腳上。這種情況下,芯片內(nèi)的時(shí)鐘振蕩器電路會(huì)自動(dòng)關(guān)閉,晶振時(shí)鐘或外部輸入時(shí)鐘電路被采用。此時(shí),若晶振頻率為11.0592MHz,輸出數(shù)據(jù)速率為準(zhǔn)確的10Hz或80Hz。輸出數(shù)據(jù)速率與晶振頻率以上述關(guān)系按比例增加或減少。使用外部輸入時(shí)鐘時(shí),外部時(shí)鐘信號(hào)不一定需要為方波。可將MCU芯片的晶振輸出管腳上的時(shí)鐘信號(hào)通過20pF的隔直電容連接到XI管腳上,作為外部時(shí)鐘輸入。外部時(shí)鐘輸入信號(hào)的幅值可低至150mV。
串口通訊
串口通訊線由管腳PD_SCK和DOUT組成,用來輸出數(shù)據(jù),選擇輸入通道和增益。當(dāng)數(shù)據(jù)輸出管腳DOUT為高電平時(shí),表明A/D轉(zhuǎn)換器還未準(zhǔn)備好輸出數(shù)據(jù),此時(shí)串口時(shí)鐘輸入信號(hào)PD_SCK應(yīng)為低電平。當(dāng)DOUT從高電平變低電平后,PD_SCK應(yīng)輸入25至27個(gè)不等的時(shí)鐘脈沖。其中第一個(gè)時(shí)鐘脈沖的上升沿將讀出輸出24位數(shù)據(jù)的最高位(MSB),直至第24個(gè)時(shí)鐘脈沖完成,24位輸出數(shù)據(jù)從最高位至最低位逐位輸出完成。第25至27個(gè)時(shí)鐘脈沖用來選擇下一次A/D轉(zhuǎn)換的輸入通道和增益。
復(fù)位和斷電
當(dāng)芯片上電時(shí),芯片內(nèi)的上電自動(dòng)復(fù)位電路會(huì)使芯片自動(dòng)復(fù)位。管腳PD_SCK輸入用來控制HX711的斷電。當(dāng)PD_SCK為低電平時(shí),芯片處于正常工作狀態(tài)。
如果PD_SCK從低電平變高電平并保持在高電平超過60μs,HX711 即進(jìn)入斷電狀態(tài)
如使用片內(nèi)穩(wěn)壓電源電路,斷電時(shí),外部傳感器和片內(nèi)A/D 轉(zhuǎn)換器會(huì)被同時(shí)斷電。當(dāng)PD_SCK 重新回到低電平時(shí),芯片會(huì)自動(dòng)復(fù)位后進(jìn)入正常工作狀態(tài)。芯片從復(fù)位或斷電狀態(tài)進(jìn)入正常工作狀態(tài)后,通道A和增益128會(huì)被自動(dòng)選擇作為第一次A/D轉(zhuǎn)換的輸入通道和增益。隨后的輸入通道和增益選擇由PD_SCK的脈沖數(shù)決定,參見串口通訊一節(jié)。芯片從復(fù)位或斷電狀態(tài)進(jìn)入正常工作狀態(tài)后,A/D 轉(zhuǎn)換器需要4個(gè)數(shù)據(jù)輸出周期才能穩(wěn)定。DOUT在4個(gè)數(shù)據(jù)輸出周期后才會(huì)從高電平變低電平,輸出有效數(shù)據(jù)。
HX711相關(guān)部分的 PCB 設(shè)計(jì)
HX711相關(guān)部分的 PCB 板參考設(shè)計(jì)線路圖
軟件驅(qū)動(dòng)
串口通訊線由管腳PD_SCK和DOUT組成,用來輸出數(shù)據(jù),選擇輸入通道和增益。當(dāng)數(shù)據(jù)輸出管腳DOUT為高電平時(shí),表明A/D轉(zhuǎn)換器還未準(zhǔn)備好輸出數(shù)據(jù),此時(shí)串口時(shí)鐘輸入信號(hào)PD_SCK應(yīng)為低電平。當(dāng)DOUT從高電平變低電平后,PD_SCK應(yīng)輸入25至27個(gè)不等的時(shí)鐘脈沖。其中第一個(gè)時(shí)鐘脈沖的上升沿將讀出輸出24位數(shù)據(jù)的最高位(MSB),直至第24個(gè)時(shí)鐘脈沖完成,24位輸出數(shù)據(jù)從最高位至最低位逐位輸出完成。第25至27個(gè)時(shí)鐘脈沖用來選擇下一次A/D轉(zhuǎn)換的輸入通道和增益。
PD_SCK的輸入時(shí)鐘脈沖數(shù)不應(yīng)少于25或多于27,否則會(huì)造成串口通訊錯(cuò)誤。當(dāng)A/D轉(zhuǎn)換器的輸入通道或增益改變時(shí),A/D轉(zhuǎn)換器需要4個(gè)數(shù)據(jù)輸出周期才能穩(wěn)定。DOUT在4個(gè)數(shù)據(jù)輸出周期后才會(huì)從高電平變低電平,輸出有效數(shù)據(jù)。
數(shù)據(jù)輸出,輸入通道和增益選擇時(shí)序圖
通過測(cè)得的AD值,轉(zhuǎn)為重力原理如下:
假設(shè)重力為 A Kg,(x<5Kg),測(cè)量出來的 AD 值為 y
傳感器輸出,發(fā)送給 AD 模塊兒的電壓為 A Kg * 4.3mV / 5Kg = 0.86A mV
經(jīng)過 128 倍增益后為 128 * 0.86A = 110.08AmV
轉(zhuǎn)換為 24bit 數(shù)字信號(hào)為 110.08A mV * 224 / 4.3V = 429496.7296A
所以 y = 429496.7296A
因此得出 A = y / 429496.7296
所以得出程序中計(jì)算公式文章來源:http://www.zghlxwxcb.cn/news/detail-630363.html
Weight_Shiwu = (unsigned long)((float)Weight_Shiwu/429.5)文章來源地址http://www.zghlxwxcb.cn/news/detail-630363.html
C51軟件代碼
sbit ADDO = P1^5;
sbit ADSK = P0^0;
unsigned long ReadCount(void)
{
unsigned long Count;
unsigned char i;
ADSK=0;
//使能AD(PD_SCK 置低)
Count=0;
while(ADDO);
//AD轉(zhuǎn)換未結(jié)束則等待,否則開始讀取
for (i=0;i<24;i++)
{
ADSK=1;
//PD_SCK 置高(發(fā)送脈沖)
Count=Count<<1; //下降沿來時(shí)變量Count左移一位,右側(cè)補(bǔ)零
ADSK=0;
//PD_SCK 置低
if(ADDO) Count++;
}
ADSK=1;
Count=Count^0x800000;//第25個(gè)脈沖下降沿來時(shí),轉(zhuǎn)換數(shù)據(jù)
ADSK=0;
return(Count);
}
STM32軟件代碼
#define DWT_CYCCNT *(volatile unsigned int *)0xE0001004
#define DWT_CR *(volatile unsigned int *)0xE0001000
#define DEM_CR *(volatile unsigned int *)0xE000EDFC
#define DBGMCU_CR *(volatile unsigned int *)0xE0042004
#define DEM_CR_TRCENA (1 << 24)
#define DWT_CR_CYCCNTENA (1 << 0)
#define WEIGHT_CAP_NUM 1 //重量采集數(shù)量 濾波使用
uint8_t ucWeightCapCompleteFlag= 0; //重量采集完成標(biāo)志
uint8_t ucWeightCapCount = 0; //重量采集計(jì)數(shù)
int32_t ilWeightRawDataAddToal = 0; //重量AD數(shù)據(jù)累計(jì)
int16_t iWeightRawData = 0; //重量AD數(shù)據(jù)
/*
*********************************************************************************************************
* 函 數(shù) 名: bsp_InitDWT
* 功能說明: 初始化DWT.
*********************************************************************************************************
*/
void bsp_InitDWT(void)
{
DEM_CR |= (unsigned int)DEM_CR_TRCENA; /* Enable Cortex-M4's DWT CYCCNT reg. */
DWT_CYCCNT = (unsigned int)0u;
DWT_CR |= (unsigned int)DWT_CR_CYCCNTENA;
}
/*
*********************************************************************************************************
* 函 數(shù) 名: DWT_DelayUS
* 功能說明: 這里的延時(shí)采用CPU的內(nèi)部計(jì)數(shù)實(shí)現(xiàn),32位計(jì)數(shù)器
* OSSchedLock(&err);
* bsp_DelayUS(5);
* OSSchedUnlock(&err); 根據(jù)實(shí)際情況看看是否需要加調(diào)度鎖或選擇關(guān)中斷
* 形 參: _ulDelayTime 延遲長(zhǎng)度,單位1 us
*********************************************************************************************************
*/
void DWT_DelayUS(uint32_t _ulDelayTime)
{
uint32_t tCnt, tDelayCnt;
uint32_t tStart;
tStart = DWT_CYCCNT; /* 剛進(jìn)入時(shí)的計(jì)數(shù)器值 */
tCnt = 0;
tDelayCnt = _ulDelayTime * (SystemCoreClock / 1000000); /* 需要的節(jié)拍數(shù) */
while(tCnt < tDelayCnt)
{
tCnt = DWT_CYCCNT - tStart; /* 求減過程中,如果發(fā)生第一次32位計(jì)數(shù)器重新計(jì)數(shù),依然可以正確計(jì)算 */
}
}
/*
*********************************************************************************************************
* 函 數(shù) 名: HX711_GPIOInit
* 功能說明: 重量芯片HX711 GPIO初始化
*********************************************************************************************************
*/
void HX711_GPIOInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PORTA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PA7 推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //PA6 推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*
*********************************************************************************************************
* 函 數(shù) 名: HX711_Init
* 功能說明: 重量芯片HX711初始化
*********************************************************************************************************
*/
void HX711_Init(void)
{
CH376_SPI_SCS = 1; //CH376 片選失能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, DISABLE);
SPI_Cmd(SPI1, DISABLE); //禁止SPI
HX711_GPIOInit(); //初始化IO
}
/*
*********************************************************************************************************
* 函 數(shù) 名: Task_WeightCap
* 功能說明: 重量采集任務(wù)
*********************************************************************************************************
*/
void Task_WeightCap(void)
{
uint32_t count = 0;
int16_t raw_data = 0;
uint8_t i;
HX711_Init(); //HX711重新初始化
ADSK = 0;
count= 0;
while(ADDO);
for(i=0; i<24; i++)
{
ADSK = 1;
DWT_DelayUS(1);
count = count << 1;
ADSK = 0;
DWT_DelayUS(1);
if(ADDO)
{
count++;
}
}
//第25個(gè)時(shí)鐘信號(hào)
ADSK=1;
DWT_DelayUS(1);
ADSK=0;
DWT_DelayUS(1);
raw_data = count >> 8;
ilWeightRawDataAddToal = raw_data + ilWeightRawDataAddToal;
ucWeightCapCount++;
if(ucWeightCapCount == WEIGHT_CAP_NUM)
{
ucWeightCapCount = 0;
iWeightRawData = ilWeightRawDataAddToal / WEIGHT_CAP_NUM;
ilWeightRawDataAddToal = 0;
ucWeightCapCompleteFlag = 1;
}
}
/*
*********************************************************************************************************
* 函 數(shù) 名: GetWeightRawData
* 功能說明: 得到重量的原始值
* 形 參: iRawData 原始值
* 返 回 值: 1 已經(jīng)得到 0 沒有得到
*********************************************************************************************************
*/
uint8_t GetWeightRawData(int16_t *iRawData)
{
if(ucWeightCapCompleteFlag == 1)
{
*iRawData = iWeightRawData;
ucWeightCapCompleteFlag = 0;
return 1;
}
return 0;
}
到了這里,關(guān)于電子模塊|壓力傳感器模塊HX711---硬件介紹與C51&&STM32驅(qū)動(dòng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!