在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

武漢芯源CW32L031實(shí)現(xiàn)超遠(yuǎn)距離超低耗無線采集

華仔的編程隨筆 ? 來源:華仔的編程隨筆 ? 作者:華仔的編程隨筆 ? 2023-06-30 16:03 ? 次閱讀

CW32L031實(shí)現(xiàn)低功耗溫濕度

【硬件環(huán)境】

  1. CW32L031C8開發(fā)板
  2. SHT30溫濕度傳感器
  3. E31-TTL-50無線串口模塊

【開發(fā)板環(huán)境】

Ubuntu20.0.4

【代碼編輯器】

VSCODE ssh遠(yuǎn)程

【編譯器】

arm-none-eabi-gcc

【工程包】

Cw32l031_gcc工程包

【工程概述】

本工程的核心分為sht30數(shù)據(jù)采集后,經(jīng)無線串口模塊發(fā)送給上位機(jī),利用自動(dòng)喚醒模塊休眠指定時(shí)長后再次喚醒系統(tǒng)進(jìn)行數(shù)據(jù)采集。

【初略原理圖】

image.png

【程序流程圖】

image.png

【主要代碼】

  1. 自動(dòng)喚醒定時(shí)器(AWT) 包含一個(gè) 16bit 向下計(jì)數(shù)器,并由一個(gè)可編程預(yù)分頻器驅(qū)動(dòng)。AWT 可選 5 種計(jì)數(shù)時(shí)鐘源,可工作于定時(shí)模式或計(jì)數(shù)模式。當(dāng)計(jì)數(shù)器時(shí)鐘源為 LSE 或 LSI 時(shí),AWT 可在深度休眠模式下保持運(yùn)行,下溢出中斷可喚醒 MCU 回到運(yùn)行模式。具體配置代碼如下:
void Init_awt_power(void)

{

    AWT_TimeCntInitTypeDef AWT_TimeCntInitStruct = {0};

    RCC_APBPeriphClk_Enable2(RCC_APB2_PERIPH_AWT, ENABLE);  //Open AWT Clk

    RCC_SystemCoreClockUpdate( RCC_Sysctrl_GetHClkFreq() );

    RCC_LSI_Enable();

 

    

    AWT_TimeCntStructInit( &AWT_TimeCntInitStruct );

    AWT_TimeCntInitStruct.AWT_ClkSource = AWT_CLKSOURCE_LSI;

    AWT_TimeCntInitStruct.AWT_Prescaler = AWT_PRS_DIV32768;

    AWT_TimeCntInitStruct.AWT_Mode = AWT_MODE_TIMECNT;

    AWT_TimeCntInitStruct.AWT_Period = 120;

    AWT_TimeCntInit(&AWT_TimeCntInitStruct);

 

    __disable_irq();

    NVIC_EnableIRQ(AWT_IRQn);

    __enable_irq();

    //使能AWT下溢出中斷

    AWT_ITConfig(AWT_IT_UD, ENABLE);

    AWT_Cmd(ENABLE);

 

    //DeepSleep喚醒時(shí),保持原系統(tǒng)時(shí)鐘來源

    RCC_WAKEUPCLK_Config(RCC_SYSCTRL_WAKEUPCLKDIS);

 

    

}
  1. 軟件IIC的配置,這里使用軟件模擬實(shí)現(xiàn)。具體代碼如下:
#include "myiic.h"

 

#define  I2C1_SCL_GPIO_PORT       CW_GPIOB

#define  I2C1_SCL_GPIO_PIN        GPIO_PIN_10   

#define  I2C1_SDA_GPIO_PORT       CW_GPIOB

#define  I2C1_SDA_GPIO_PIN        GPIO_PIN_11  

 

void delay_us(uint32_t us)

{

    while(us--)

    {

        __NOP();

        __NOP();

        __NOP();

        __NOP();

        __NOP();

    }

    

}

 

void IIC_Init(void)

{

      //配置PB10 為輸出

    //使能GPIOB時(shí)鐘

    CW_SYSCTRL- >AHBEN_f.GPIOB  = 1;

    //配置PB10 為輸出

    CW_GPIOB- >ANALOG_f.PIN10 = 0; //設(shè)置 GPIOx_ANALOG.PINy 為 0,將端口配置為數(shù)字功能;

    CW_GPIOB- >DIR_f.PIN10 = 0;    //設(shè)置 GPIOx_DIR.PINy 為 0,將端口配置成輸出;

    CW_GPIOB- >OPENDRAIN_f.PIN10 = 0;  //0:推挽輸出

    CW_GPIOB- >ODR_f.PIN10 = 1;

    

    CW_GPIOB- >ANALOG_f.PIN11 = 0; //設(shè)置 GPIOx_ANALOG.PINy 為 0,將端口配置為數(shù)字功能;

    CW_GPIOB- >DIR_f.PIN11 = 0;    //設(shè)置 GPIOx_DIR.PINy 為 0,將端口配置成輸出;

    CW_GPIOB- >OPENDRAIN_f.PIN11 = 0;  //0:推挽輸出

    CW_GPIOB- >ODR_f.PIN11 = 1;

        

}

                                                                                                             

//IO方向設(shè)置(SDA)

/*********xxxxxxxxxxxxxx*************/

void SDA_IN()  

{ 

    CW_GPIOB- >DIR_f.PIN11 = 1;    //設(shè)置 GPIOx_DIR.PINy 為 0,將端口配置成輸出;

}

 

void SDA_OUT()

{ 

  CW_GPIOB- >DIR_f.PIN11 = 0;    //設(shè)置 GPIOx_DIR.PINy 為 0,將端口配置成輸出;

    CW_GPIOB- >OPENDRAIN_f.PIN11 = 0;  //0:推挽輸出

}

 

//產(chǎn)生IIC起始信號(hào)

void IIC_Start(void)

{

    SDA_OUT();     //sda線輸出

    IIC_SDA=1;        

    IIC_SCL=1;

    delay_us(4);

    IIC_SDA=0;//START:when CLK is high,DATA change form high to low 

    delay_us(4);

    IIC_SCL=0;//鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) 

}   

 

//產(chǎn)生IIC停止信號(hào)

void IIC_Stop(void)

{

    SDA_OUT();//sda線輸出

    IIC_SCL=0;

    IIC_SDA=0;//STOP:when CLK is high DATA change form low to high

    delay_us(4);

    IIC_SCL=1; 

    IIC_SDA=1;//發(fā)送I2C總線結(jié)束信號(hào)

    delay_us(4);                                

}

 

//等待應(yīng)答信號(hào)到來

//返回值:1,接收應(yīng)答失敗

//        0,接收應(yīng)答成功

/*********xxxx修改超時(shí)時(shí)間************/

uint8_t IIC_Wait_Ack(void)

{

    uint8_t ucErrTime=0;

    SDA_IN();      //SDA設(shè)置為輸入  

    IIC_SDA=1;delay_us(3);     

    IIC_SCL=1;delay_us(3);   

    while(READ_SDA)

    {

        ucErrTime++;

        if(ucErrTime >250)

        {

            //printf("超時(shí)\\n");

            IIC_Stop();

            return 1;

        }

    }

    IIC_SCL=0;//時(shí)鐘輸出0      

    return 0;  

} 

 

//產(chǎn)生ACK應(yīng)答

void IIC_Ack(void)

{

    IIC_SCL=0;

    SDA_OUT();

    IIC_SDA=0;

    delay_us(2);

    IIC_SCL=1;

    delay_us(2);

    IIC_SCL=0;

}

 

//不產(chǎn)生ACK應(yīng)答          

void IIC_NAck(void)

{

    IIC_SCL=0;

    SDA_OUT();

    IIC_SDA=1;

    delay_us(2);

    IIC_SCL=1;

    delay_us(2);

    IIC_SCL=0;

}           

 

//IIC發(fā)送一個(gè)字節(jié)

//返回從機(jī)有無應(yīng)答

//1,有應(yīng)答

//0,無應(yīng)答           

void IIC_Send_Byte(uint8_t txd)

{                        

    uint8_t t;   

        SDA_OUT();      

    IIC_SCL=0;//拉低時(shí)鐘開始數(shù)據(jù)傳輸

    for(t=0;t< 8;t++)

    {              

        if((txd&0x80) >>7)

            IIC_SDA=1;

        else

            IIC_SDA=0;

        txd< <=1;      

        delay_us(2);   //對(duì)TEA5767這三個(gè)延時(shí)都是必須的

        IIC_SCL=1;

        delay_us(2); 

        IIC_SCL=0;  

        delay_us(2);

    }    

}     

 

//讀1個(gè)字節(jié),ack=1時(shí),發(fā)送ACK,ack=0,發(fā)送nACK   

uint8_t IIC_Read_Byte(unsigned char ack)

{

    unsigned char i,receive=0;

    SDA_IN();//SDA設(shè)置為輸入

  for(i=0;i< 8;i++ )

    {

        IIC_SCL=0; 

        delay_us(100);

            IIC_SCL=1;

        receive< <=1;

        if(READ_SDA) receive++;   

        delay_us(100); 

    }                    

    if (!ack)

        IIC_NAck();//發(fā)送nACK

    else

        IIC_Ack(); //發(fā)送ACK   

    return receive;

}
  1. SHT30的采集程序如下:
#include "sht30.h"

#include "myiic.h"

 

#define POLYNOMIAL_CXDZ 0x31 // X^8 + X^5 + X^4 + 1

//SHT3X CRC校驗(yàn)

unsigned char SHT3X_CRC(uint8_t *data, uint8_t len)

{

    unsigned char bit;        // bit mask

    unsigned char crc = 0xFF; // calculated checksum

    unsigned char byteCtr;    // byte counter

 

    // calculates 8-Bit checksum with given polynomial @GZCXDZ

    for(byteCtr = 0; byteCtr < len; byteCtr++) {

            crc ^= (data[byteCtr]);

            for(bit = 8; bit > 0; --bit) {

                    if(crc & 0x80) {

                            crc = (crc < < 1) ^ POLYNOMIAL_CXDZ;

                    }  else {

                            crc = (crc < < 1);

                    }

            }

    }

  return crc;

}

 

//SHT30命令函數(shù)

//addr:表示產(chǎn)品的序號(hào),因?yàn)镾HT30使用IIC總線的話一條線上可以掛兩個(gè)

void SHT30_CMD(uint16_t cmd)

{

    IIC_Start();

    IIC_Send_Byte(SHT30_ADDR+0);  //發(fā)送設(shè)備地址,寫寄存器

    IIC_Wait_Ack();

    IIC_Send_Byte((cmd >>8)&0xff); //MSB

 

    IIC_Wait_Ack();

    IIC_Send_Byte(cmd&0xff); //LSB

 

    IIC_Wait_Ack();

    IIC_Stop();

    SysTickDelay(50);//命令發(fā)完后需要等待20ms以上才能讀寫

}



//SHT30讀取溫濕度

//temp:溫度,-400~1250,實(shí)際溫度=temp/10,分辨率0.1℃,精度±0.3℃

//humi:濕度,0~1000,實(shí)際濕度=humi/10,分辨率0.1%rh,精度±3

//返回0成功,1失敗

uint8_t SHT30_Read_Humiture(int *temp,uint16_t *humi)

{

    uint8_t buff[6];

    

    SHT30_CMD(SHT30_READ_HUMITURE);//讀溫濕度命令

    

    IIC_Start();

    IIC_Send_Byte(SHT30_ADDR+1); //發(fā)送設(shè)備地址,讀寄存器

    IIC_Wait_Ack();

    buff[0]=IIC_Read_Byte(1);//繼續(xù)讀,給應(yīng)答

    buff[1]=IIC_Read_Byte(1);//繼續(xù)讀,給應(yīng)答

    buff[2]=IIC_Read_Byte(1);//繼續(xù)讀,給應(yīng)答

    buff[3]=IIC_Read_Byte(1);//繼續(xù)讀,給應(yīng)答

    buff[4]=IIC_Read_Byte(1);//繼續(xù)讀,給應(yīng)答

    buff[5]=IIC_Read_Byte(0);//不繼續(xù)給停止應(yīng)答

    IIC_Stop();

 

    

    //printf("buff=%d,%d,%d,%d,%d,%d\\r\\n",buff[0],buff[1],buff[2],buff[3],buff[4],buff[5]);

    //CRC校驗(yàn)

    if(SHT3X_CRC(&buff[0],2)==buff[2] && SHT3X_CRC(&buff[3],2)==buff[5])

    {

 

        *temp=(-45+(175.0*((buff[0]< 8)+buff[1])/65535.0))*10;

        *humi=10*100*((buff[3]< 8)+buff[4])/65535.0;

        if(*temp >1250) *temp=1250;

        else if(*temp< -400) *temp=-400;

        return 0;

    }

    else return 1;  

    

}

 

//SHT30初始化

void SHT30_Init()

{

    IIC_Init();

}
  1. 在主程序中,我們首先對(duì)串口、IIC、AWT、SHT30進(jìn)行初始化,然后進(jìn)入采集程序,實(shí)現(xiàn)的代碼如下:
int main(void)

{

    int t[6];

    uint16_t h[6];

    E31_UART_Init();

    SHT30_Init();

    USART_ITConfig(CW_UART1, USART_IT_RC, ENABLE);

    Init_awt_power();

    InitTick(24000000ul); //初始化SysTick

    // 開啟兩線調(diào)試接口

    RCC_SWDIO_Config(RCC_SYSCTRL_SWDIOEN);

    while (1)

    {

        SHT30_Read_Humiture(t,h);

        e31_send(t[0],h[0]);

        enter_lowpower();

        exit_lowpower();

    }

 

    return 0;

}

【程序效果】

模塊采集的數(shù)據(jù),在上位機(jī)的串口助手上接收到以16進(jìn)制數(shù)據(jù)發(fā)送的溫濕度數(shù)據(jù)。

image.png

上位機(jī)根據(jù)具體的需要再進(jìn)行解析、判斷或者分發(fā)。

【功耗測(cè)試】

此工程以合宙的IoT Power來采集功率耗數(shù)據(jù),并做出基本的分析,具體效果如下圖:

image.png

從上面的數(shù)據(jù)我們可以看出,待機(jī)電流為7.5微安左右,在每兩分鐘啟用一次數(shù)據(jù)上報(bào),最在工作電流為46.5mA,平均電流為110uA,平均功率為362微瓦。可以推算一下,1000mAH的電池可以持續(xù)供電100天左右。如果我們采用在溫濕度正常的范圍內(nèi)緩存,每一個(gè)小時(shí)做一次數(shù)據(jù)上傳,那么預(yù)計(jì)可以延長30倍的工作時(shí)間,那就是10年左右的待機(jī)。

【討論】

CW32L031具有超低功耗的出色性能,此實(shí)驗(yàn)的意義驗(yàn)證了在電池供電的環(huán)境下,可以持續(xù)的工作數(shù)年的可能。433M無線超遠(yuǎn)距離無線轉(zhuǎn)輸模塊可以提供長達(dá)5公里(空曠)數(shù)據(jù)傳輸,廣泛適用于智慧農(nóng)業(yè)等野外的數(shù)據(jù)持續(xù)采集。也可以把溫濕度傳感器更改為土壤濕度、門禁等傳感器,實(shí)現(xiàn)無線報(bào)警等功能。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2551

    文章

    51099

    瀏覽量

    753572
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3248

    瀏覽量

    114801
  • 編輯器
    +關(guān)注

    關(guān)注

    1

    文章

    806

    瀏覽量

    31172
  • 無線采集
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    7982
  • 武漢芯源
    +關(guān)注

    關(guān)注

    1

    文章

    66

    瀏覽量

    255
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    首創(chuàng)ubuntu下cw32l031的vscode+gcc工程創(chuàng)建、下載、調(diào)試

    首創(chuàng)在ubuntu下面用vscode實(shí)現(xiàn)cw32l031的gcc工程創(chuàng)建、編譯、下載與調(diào)試
    的頭像 發(fā)表于 06-25 21:49 ?2.4w次閱讀
    首創(chuàng)ubuntu下<b class='flag-5'>cw32l031</b>的vscode+gcc工程創(chuàng)建、下載、調(diào)試

    【Ubuntu VSCODE+GCC】CW32L031實(shí)現(xiàn)printf工程

    CW32L031在ubuntu系統(tǒng)下面實(shí)現(xiàn)GCC,驅(qū)動(dòng)UART,實(shí)現(xiàn)printf工程
    的頭像 發(fā)表于 06-28 17:07 ?1077次閱讀
    【Ubuntu VSCODE+GCC】<b class='flag-5'>CW32L031</b><b class='flag-5'>實(shí)現(xiàn)</b>printf工程

    Ubuntu VSCODE+GCC】CW32L031驅(qū)動(dòng)sht30

    CW32L031在ubuntu下面,使用VSCODE+gcc實(shí)現(xiàn)對(duì)sht30溫濕計(jì)的驅(qū)動(dòng)
    的頭像 發(fā)表于 06-28 17:12 ?2.4w次閱讀
    Ubuntu VSCODE+GCC】<b class='flag-5'>CW32L031</b>驅(qū)動(dòng)sht30

    NRF24L01+PA+LNA 無線遠(yuǎn)距離2.4G模塊

    本帖最后由 eehome 于 2013-1-5 10:09 編輯 NRF24L01+PA+LNA 無線遠(yuǎn)距離2.4G模塊250K的速率下,空曠地的
    發(fā)表于 04-11 10:16

    NRF24L01+PA+LNA 無線遠(yuǎn)距離2.4G模塊250K的速率下

    NRF24L01+PA+LNA 無線遠(yuǎn)距離2.4G模塊250K的速率下,空曠地的距離為1100米左右,1M的速率下,空曠地的
    發(fā)表于 05-17 15:00

    遠(yuǎn)距離無線模塊APC810

    `采用SEMTECH新的LORA的無線擴(kuò)頻芯片SI1278,采用擴(kuò)頻調(diào)制和高效糾錯(cuò)編碼,集成的APC810模塊,經(jīng)過一級(jí)放大,功耗推到500毫瓦,在5K速率下,空曠距離能達(dá)5公里,非常適合遠(yuǎn)
    發(fā)表于 02-03 12:03

    武漢】IAR Embedded Workbench?集成開發(fā)環(huán)境已全面支持武漢CW32 MCU系列

    版本起,IAR將全面支持武漢CW32F030系列、CW32F003系列、CW32L083系
    發(fā)表于 06-14 14:54

    【產(chǎn)品介紹】32位低功耗MCU CW32L031系列產(chǎn)品介紹

    Cortex-M0+低功耗MCU CW32L031系列型號(hào)展示武漢半導(dǎo)體32位低功耗CW32L031系列集成了主頻可達(dá)48MHz的ARM
    發(fā)表于 09-16 10:30

    持續(xù)深耕物聯(lián)網(wǎng)領(lǐng)域,武漢半導(dǎo)體發(fā)布Sub-1G系列產(chǎn)品CW32W031

    武漢半導(dǎo)體持續(xù)深耕物聯(lián)網(wǎng)領(lǐng)域,繼推出藍(lán)牙系列芯片CW32R030后,再次推出Sub-1G系列產(chǎn)品CW32W031。該產(chǎn)品是基于
    發(fā)表于 01-05 13:35

    ubuntu下面用vscdoe實(shí)現(xiàn)CW32L031的工程創(chuàng)建、編譯、下載與調(diào)試

    目前官方提供CW32L083只提供了MDK、IAR下的固件庫、啟動(dòng)文件。我有過成功CW32L083的項(xiàng)目移植的經(jīng)驗(yàn),現(xiàn)在成功的把CW32L031的工程移植到ubuntu下面,實(shí)現(xiàn)了VS
    發(fā)表于 06-25 21:13

    CW32L031產(chǎn)品介紹

    CW32L031是一款基于eFlash的單芯片低功耗微控制器,集成了ARM?Cortex?-M0+ 核心,主頻高達(dá)48MHz,高速嵌入式存儲(chǔ)器(高達(dá)64KB的FLASH和 高達(dá)8K字節(jié)的SRAM
    發(fā)表于 09-14 06:02

    CW32L031微控制器數(shù)據(jù)手冊(cè)

    CW32L031 是基于 eFlash 的單芯片低功耗微控制器,集成了主頻高達(dá) 48MHz 的 ARM? Cortex?-M0+ 內(nèi)核、高速嵌入式存儲(chǔ)器(多至 64K 字節(jié) FLASH 和多至 8K
    發(fā)表于 09-14 08:26

    CW32L031 StartKit軟件包

    CW32L031 StartKit 軟件包
    發(fā)表于 09-15 07:58

    【產(chǎn)品介紹】32位低功耗MCU CW32L031系列產(chǎn)品介紹

    Cortex-M0+低功耗MCUCW32L031系列型號(hào)展示武漢半導(dǎo)體32位低功耗CW32L031系列集成了主頻可達(dá)48MHz的ARMC
    的頭像 發(fā)表于 09-16 10:42 ?1479次閱讀
    【產(chǎn)品介紹】32位低功耗MCU <b class='flag-5'>CW32L031</b>系列產(chǎn)品介紹

    持續(xù)深耕物聯(lián)網(wǎng)領(lǐng)域,武漢半導(dǎo)體發(fā)布Sub-1G系列產(chǎn)品CW32W031

    武漢半導(dǎo)體持續(xù)深耕物聯(lián)網(wǎng)領(lǐng)域,繼推出藍(lán)牙系列芯片CW32R030后,再次推出Sub-1G系列產(chǎn)品CW32W031。該產(chǎn)品是基于
    的頭像 發(fā)表于 01-05 13:36 ?981次閱讀
    持續(xù)深耕物聯(lián)網(wǎng)領(lǐng)域,<b class='flag-5'>武漢</b><b class='flag-5'>芯</b><b class='flag-5'>源</b>半導(dǎo)體發(fā)布Sub-1G系列產(chǎn)品<b class='flag-5'>CW32W031</b>
    主站蜘蛛池模板: 日韩一级欧美一级在线观看| 你懂的 在线观看| 四虎永久在线观看免费网站网址| 在线观看日本免费视频大片一区| 日本不卡一| 在线电影亚洲| 四虎影院免费视频| 国产成人精品日本亚洲专| 午夜精品福利视频| 国产精品莉莉欧美自在线线| 49pao强力免费打造在线高清| 最新人妖shemaletube人妖| 色婷婷视频在线观看| 玖玖色视频| 亚洲福利午夜| 黑色丝袜美女被网站| 亚欧美视频| 色综合中文字幕| 狠狠插综合网| 色网综合| 午夜欧美在线| 六月丁香婷婷激情| 久久是精品| 午夜久久久久久亚洲国产精品| 色婷婷色综合| 手机福利视频| 在线免费亚洲| 女人张开腿等男人桶免费视频| 欧美美女被日| 日本欧美视频| 久久性久久性久久久爽| 婷婷久久五月天| 狠狠色噜噜狠狠狠狠91| 日本黄色大片免费看| 在线中文天堂| 欧美黑人xxxxxxxxxx| 亚州黄色网址| 国产精品人成在线播放新网站| 黄色一区二区三区| 天堂国产| 亚洲午夜久久|