精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

武漢芯源CW32L031實現超遠距離超低耗無線采集

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

CW32L031實現低功耗溫濕度

硬件環境】

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

【開發板環境】

Ubuntu20.0.4

【代碼編輯器】

VSCODE ssh遠程

【編譯器】

arm-none-eabi-gcc

【工程包】

Cw32l031_gcc工程包

【工程概述】

本工程的核心分為sht30數據采集后,經無線串口模塊發送給上位機,利用自動喚醒模塊休眠指定時長后再次喚醒系統進行數據采集。

【初略原理圖】

image.png

【程序流程圖】

image.png

【主要代碼】

  1. 自動喚醒定時器(AWT) 包含一個 16bit 向下計數器,并由一個可編程預分頻器驅動。AWT 可選 5 種計數時鐘源,可工作于定時模式或計數模式。當計數器時鐘源為 LSE 或 LSI 時,AWT 可在深度休眠模式下保持運行,下溢出中斷可喚醒 MCU 回到運行模式。具體配置代碼如下:
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喚醒時,保持原系統時鐘來源

    RCC_WAKEUPCLK_Config(RCC_SYSCTRL_WAKEUPCLKDIS);

 

    

}
  1. 軟件IIC的配置,這里使用軟件模擬實現。具體代碼如下:
#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時鐘

    CW_SYSCTRL- >AHBEN_f.GPIOB  = 1;

    //配置PB10 為輸出

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

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

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

    CW_GPIOB- >ODR_f.PIN10 = 1;

    

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

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

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

    CW_GPIOB- >ODR_f.PIN11 = 1;

        

}

                                                                                                             

//IO方向設置(SDA)

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

void SDA_IN()  

{ 

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

}

 

void SDA_OUT()

{ 

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

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

}

 

//產生IIC起始信號

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總線,準備發送或接收數據 

}   

 

//產生IIC停止信號

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;//發送I2C總線結束信號

    delay_us(4);                                

}

 

//等待應答信號到來

//返回值:1,接收應答失敗

//        0,接收應答成功

/*********xxxx修改超時時間************/

uint8_t IIC_Wait_Ack(void)

{

    uint8_t ucErrTime=0;

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

    IIC_SDA=1;delay_us(3);     

    IIC_SCL=1;delay_us(3);   

    while(READ_SDA)

    {

        ucErrTime++;

        if(ucErrTime >250)

        {

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

            IIC_Stop();

            return 1;

        }

    }

    IIC_SCL=0;//時鐘輸出0      

    return 0;  

} 

 

//產生ACK應答

void IIC_Ack(void)

{

    IIC_SCL=0;

    SDA_OUT();

    IIC_SDA=0;

    delay_us(2);

    IIC_SCL=1;

    delay_us(2);

    IIC_SCL=0;

}

 

//不產生ACK應答          

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發送一個字節

//返回從機有無應答

//1,有應答

//0,無應答           

void IIC_Send_Byte(uint8_t txd)

{                        

    uint8_t t;   

        SDA_OUT();      

    IIC_SCL=0;//拉低時鐘開始數據傳輸

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

    {              

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

            IIC_SDA=1;

        else

            IIC_SDA=0;

        txd< <=1;      

        delay_us(2);   //對TEA5767這三個延時都是必須的

        IIC_SCL=1;

        delay_us(2); 

        IIC_SCL=0;  

        delay_us(2);

    }    

}     

 

//讀1個字節,ack=1時,發送ACK,ack=0,發送nACK   

uint8_t IIC_Read_Byte(unsigned char ack)

{

    unsigned char i,receive=0;

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

  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();//發送nACK

    else

        IIC_Ack(); //發送ACK   

    return receive;

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

#include "myiic.h"

 

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

//SHT3X CRC校驗

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命令函數

//addr:表示產品的序號,因為SHT30使用IIC總線的話一條線上可以掛兩個

void SHT30_CMD(uint16_t cmd)

{

    IIC_Start();

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

    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);//命令發完后需要等待20ms以上才能讀寫

}



//SHT30讀取溫濕度

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

//humi:濕度,0~1000,實際濕度=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); //發送設備地址,讀寄存器

    IIC_Wait_Ack();

    buff[0]=IIC_Read_Byte(1);//繼續讀,給應答

    buff[1]=IIC_Read_Byte(1);//繼續讀,給應答

    buff[2]=IIC_Read_Byte(1);//繼續讀,給應答

    buff[3]=IIC_Read_Byte(1);//繼續讀,給應答

    buff[4]=IIC_Read_Byte(1);//繼續讀,給應答

    buff[5]=IIC_Read_Byte(0);//不繼續給停止應答

    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校驗

    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. 在主程序中,我們首先對串口、IIC、AWT、SHT30進行初始化,然后進入采集程序,實現的代碼如下:
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

    // 開啟兩線調試接口

    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;

}

【程序效果】

模塊采集的數據,在上位機的串口助手上接收到以16進制數據發送的溫濕度數據。

image.png

上位機根據具體的需要再進行解析、判斷或者分發。

【功耗測試】

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

image.png

從上面的數據我們可以看出,待機電流為7.5微安左右,在每兩分鐘啟用一次數據上報,最在工作電流為46.5mA,平均電流為110uA,平均功率為362微瓦??梢酝扑阋幌?,1000mAH的電池可以持續供電100天左右。如果我們采用在溫濕度正常的范圍內緩存,每一個小時做一次數據上傳,那么預計可以延長30倍的工作時間,那就是10年左右的待機。

【討論】

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2548

    文章

    50740

    瀏覽量

    752137
  • 定時器
    +關注

    關注

    23

    文章

    3241

    瀏覽量

    114511
  • 編輯器
    +關注

    關注

    1

    文章

    803

    瀏覽量

    31127
  • 無線采集
    +關注

    關注

    0

    文章

    22

    瀏覽量

    7972
  • 武漢芯源
    +關注

    關注

    1

    文章

    66

    瀏覽量

    250
收藏 人收藏

    評論

    相關推薦

    首創ubuntu下cw32l031的vscode+gcc工程創建、下載、調試

    首創在ubuntu下面用vscode實現cw32l031的gcc工程創建、編譯、下載與調試
    的頭像 發表于 06-25 21:49 ?2.4w次閱讀
    首創ubuntu下<b class='flag-5'>cw32l031</b>的vscode+gcc工程創建、下載、調試

    【Ubuntu VSCODE+GCC】CW32L031實現printf工程

    CW32L031在ubuntu系統下面實現GCC,驅動UART,實現printf工程
    的頭像 發表于 06-28 17:07 ?1029次閱讀
    【Ubuntu VSCODE+GCC】<b class='flag-5'>CW32L031</b><b class='flag-5'>實現</b>printf工程

    Ubuntu VSCODE+GCC】CW32L031驅動sht30

    CW32L031在ubuntu下面,使用VSCODE+gcc實現對sht30溫濕計的驅動
    的頭像 發表于 06-28 17:12 ?2.4w次閱讀
    Ubuntu VSCODE+GCC】<b class='flag-5'>CW32L031</b>驅動sht30

    NRF24L01+PA+LNA 無線遠距離2.4G模塊

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

    NRF24L01+PA+LNA 無線遠距離2.4G模塊250K的速率下

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

    遠距離無線模塊APC810

    `采用SEMTECH新的LORA的無線擴頻芯片SI1278,采用擴頻調制和高效糾錯編碼,集成的APC810模塊,經過一級放大,功耗推到500毫瓦,在5K速率下,空曠距離能達5公里,非常適合
    發表于 02-03 12:03

    武漢】IAR Embedded Workbench?集成開發環境已全面支持武漢CW32 MCU系列

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

    【產品介紹】32位低功耗MCU CW32L031系列產品介紹

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

    持續深耕物聯網領域,武漢半導體發布Sub-1G系列產品CW32W031

    武漢半導體持續深耕物聯網領域,繼推出藍牙系列芯片CW32R030后,再次推出Sub-1G系列產品CW32W031。該產品是基于
    發表于 01-05 13:35

    ubuntu下面用vscdoe實現CW32L031的工程創建、編譯、下載與調試

    目前官方提供CW32L083只提供了MDK、IAR下的固件庫、啟動文件。我有過成功CW32L083的項目移植的經驗,現在成功的把CW32L031的工程移植到ubuntu下面,實現了VS
    發表于 06-25 21:13

    CW32L031產品介紹

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

    CW32L031微控制器數據手冊

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

    CW32L031 StartKit軟件包

    CW32L031 StartKit 軟件包
    發表于 09-15 07:58

    【產品介紹】32位低功耗MCU CW32L031系列產品介紹

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

    持續深耕物聯網領域,武漢半導體發布Sub-1G系列產品CW32W031

    武漢半導體持續深耕物聯網領域,繼推出藍牙系列芯片CW32R030后,再次推出Sub-1G系列產品CW32W031。該產品是基于
    的頭像 發表于 01-05 13:36 ?933次閱讀
    持續深耕物聯網領域,<b class='flag-5'>武漢</b><b class='flag-5'>芯</b><b class='flag-5'>源</b>半導體發布Sub-1G系列產品<b class='flag-5'>CW32W031</b>