hdl是什么意思| cta什么意思| 喝三七粉有什么好处| au9999是什么意思| igg阳性是什么意思| ed患者是什么意思| 道地是什么意思| 带子是什么海鲜| 做了胃镜多久可以吃东西吃些什么| 贤妻良母是什么意思| 吸烟有什么危害| 睡觉磨牙是什么原因| 玫瑰茄和洛神花有什么区别吗| 老年性阴道炎用什么药| 总胆固醇低是什么原因| 什么样的耳朵| 痘痘里面挤出来的白色东西是什么| 上面一个山下面一个今读什么| myp是什么意思| 这叫什么| 积劳成疾的疾是什么意思| 胃溃疡a1期是什么意思| 焦点是什么| 头晕没精神是什么原因| 陈宝莲为什么自杀| 女生腰疼是什么原因| 嗓子疼流鼻涕吃什么药| 方巾是干什么用的| 云南的特产是什么| 梦见自己穿新衣服是什么意思| 减肥最好的办法是什么| 安全期是什么| 弓箭是什么时候发明的| 七一年属什么生肖| 虎配什么生肖最好| 薄荷与什么相克| 西洋参跟花旗参有什么区别| 低密度脂蛋白胆固醇高是什么意思| 电解工是干什么的| 胎毛什么时候脱落| ms.是什么意思| 抗皱用什么产品好| 8月7日什么星座| 男性下焦湿热吃什么药| 阳性血是什么意思| 直接胆红素偏高是什么意思| 男生吃菠萝有什么好处| 蓝精灵是什么意思| 腹胀是什么病的前兆| 猫咪呕吐吃什么药可以解决| 避重就轻是什么意思| 突然头晕想吐是什么原因| 公鸭嗓是什么声音| 复光是什么意思| c肽测定是什么意思| 1949年是什么年| 依西美坦最佳服用时间是什么时间| 笔走龙蛇是什么生肖| 黄瓜炒什么| 654-2是什么药| 什么是腺样体面容| 巾帼不让须眉是什么意思| hoho是什么意思| 胎菊泡水喝有什么功效| 肠胃不好吃什么药效果好| 一个马一个并念什么| 女性更年期潮热出汗吃什么药| 捞人什么意思| 心绞痛吃什么药最好| 子宫内膜6mm意味着什么| 妈妈是什么意思| 老人肚子胀是什么原因| 神经性头痛吃什么药| 2月8日什么星座| 大舅哥是什么意思| 免疫力低吃什么补| 什么动物最厉害| 舌头锯齿状是什么原因| 减肥期间可以喝什么饮料| 梦见到处都是蛇预示着什么| ec50是什么意思| 6月18日什么星座| 新五行属什么| 为什么不孕不育| 盆腔积液是什么症状表现| 肩袖损伤用什么药| 空调变频和定频有什么区别| 蜂蜜芥末酱是什么味道| 三月十五是什么星座| 火气重吃什么降火| 塑料袋是什么垃圾| 乳腺彩超什么时候做最准确| 梦到自己老公出轨是什么意思| 优势卵泡是什么意思| 眼睛视物模糊是什么原因| 老日念什么| 气喘是什么原因| pct偏高说明什么| 小水滴会变成什么| 女生为什么喊你男神| 结肠多发憩室是什么意思| 做什么菜好吃又简单| 条状血流信号是什么意思| 细水长流是什么意思| 中耳炎用什么药| 头发老是出油是什么原因| 乌灵参是什么东西| 大耗是什么意思| 女人白带多是什么原因| 作茧自缚是什么意思| 什么的风| 剪不断理还乱是什么意思| 肺慢性炎症是什么意思| 象牙带身上有什么好处| 蒙蒙的什么| 下丘脑分泌什么激素| 夫妻都是o型血孩子是什么血型| 中成药是什么| 漂亮的什么| 今年28岁属什么生肖| 香港说什么语言| a1是什么| ACS什么意思| 单独是什么意思| 18岁属什么的生肖| 拍黄瓜是什么意思| 藕带是什么| 气血不足什么症状| 脚底出汗什么原因| 2月份生日是什么星座| mpa什么意思| iva是什么意思| 风骚什么意思| 什么药可以止血| 什么人容易得胆结石| 内裤上有黄色分泌物是什么原因| 肌酐高吃什么中药| 什么人不洗澡| 锁骨疼挂什么科| 黄色配什么颜色最搭| 太乙是什么意思| 青海古代叫什么| 甲流乙流吃什么药| 人最重要的是什么| 孕晚期脚肿是什么原因| 头发爱出油什么原因| 星座上升是什么意思| 择期什么意思| 拾到什么意思| 意境是什么意思| 茎是什么意思| 肚脐眼连接体内的什么器官| 体寒吃什么好| 金牛座女和什么座最配对| 一诺千金是什么意思| 震字五行属什么| 低血压要注意些什么| 脓毒血症是什么原因引起的| 回盲肠在什么位置| 甲亢病是一种什么病| 心悸心慌吃什么药| 时间h代表什么| 你最喜欢的食物是什么| 小孩脸肿是什么原因引起的| 杨利伟什么军衔| 七月一号什么星座| 南极为什么比北极冷| 白细胞加号什么意思| 尿失禁用什么药好| 避孕药什么时候吃| 什么是戒断反应| 绞肠痧是什么病| 肝部出现腹水是什么原因| 审计署是什么级别| 一眼万年是什么意思| 阿魏是什么中药| 属羊的本命佛是什么佛| 无水酥油是什么| 荨麻疹抹什么药| 血糖吃什么水果| 吃苹果有什么好处和功效| 指甲有竖纹是什么病| 什么叫原发性高血压| 折耳猫什么颜色最贵| 8月17号是什么日子| 嫡孙是什么意思| 嘴巴下面长痘痘是什么原因| 妇科衣原体是什么病| 已是什么生肖| 求欢是什么意思| 三月份什么星座| 卵圆孔未闭是什么病| 白交念什么| 猫弓背什么意思| 什么什么的荷叶| 易孕体质是什么意思| 肝有问题会出现什么症状| 人上人是什么意思| 鱼腥草有什么作用| 缺碘会有什么症状| 记过属于什么处分| c肽测定是什么意思| 原汤化原食什么意思| 吉利丁片是什么做的| 巴宝莉属于什么档次| chip什么意思| 什么不及| 好好活着比什么都重要| 11.15是什么星座| 肠溶片和缓释片有什么区别| 老巫婆是什么意思| 中性人是什么意思| 熟石灰是什么| 什么叫糖类抗原| 喝酒头疼是什么原因| 鸡蛋饼用什么面粉| 阙什么意思| 丝瓜不能和什么食物一起吃| 今晚开什么特马| 七夕之夜是什么生肖| 最聪明的狗是什么狗| 中元节会开什么生肖| lch是什么意思| arr是什么| 总胆红素偏高是什么意思| 阴历六月十五是什么日子| 梦见买车是什么意思| 俄罗斯人是什么人种| 经常性头疼是什么原因| 74年属什么生肖| 梦见打老鼠是什么征兆| 脾肾阳虚是什么意思| 霉菌是什么引起的| 水里有什么| 常喝黑苦荞茶有什么好处| metoo是什么意思| 男人嘴唇薄代表什么| 下午六点半是什么时辰| 命悬一线的意思是什么| 辛弃疾字什么| 为什么全身酸痛| 头晕挂什么科室| 脖子出汗多是什么原因女人| 小孩改姓需要什么手续| 麻雀吃什么食物| o型血为什么招蚊子| feel是什么意思| 乘载和核载是什么意思| 水土不服吃什么药管用| 特效药是什么意思| 眼角流泪是什么原因| 薛字五行属什么| 补钙吃什么维生素| 3月7日是什么星座| 骨折喝什么汤恢复得快| 吃什么治便秘最有效| 梨子什么季节成熟| 围棋九段是什么水平| 囊肿是什么| 诡辩是什么意思| 芍药什么时候开花| 蛋白高是什么病| 生物公司是做什么的| 缸垫呲了什么症状| 百度
打印
[CW32L083系列]

[豪华肯尼亚10天观看野生动物之旅]赠送多哈半日游

[复制链接]
10880|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lulugl|  楼主 | 2023-6-24 19:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lulugl 于 2023-6-25 08:50 编辑

#有奖活动# #申请原创# @21小跑堂【开发环境】
1、硬件:CW32L083VxTx StartKit 开发板,板载有8位LCD段码屏。
2、软件环境:MDK5。
3、温湿度计:SHT30。
【硬件连接】
开发板        SHT30
PB11           SDA
PB10           SCL
DVCC          VCC
DVSS          GND
【功耗测试环境】
合宙IoT Power功耗测试神器。
【硬件框图】

【软件流程图】

【主要代码设计】
本工程主要代码功能为温湿传感器SHT30的数据采集、LCD显示、RTC自动唤醒。下面展示三个功能模块的主要代码:
1、SHT30采集模拟IIC通信,主要是IIC的时序产生,与SHT30的单次采集指令发送与数据读取以及CRC。
IIC的时序产生主要代码如下:
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;
}
SHT30的测量指令与数据获取及CRC主要代码如下:
#include "sht30.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(500);//命令发完后需要等待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();
}
2、LCD屏的显示,分为两个部分,一个是定义了段码显示的高、低位显示数组; 二是封装了数量显示了函数,具体代码如下:
/*  段码低8(左) */
static uint8_t num_L[10] = {
        0x0d, //0
        0x00, //1
        0x0e, //2
        0x0a, //3
        0x03, //4
        0x0b,  //5
        0x0f,  //6
        0x00,  //7
        0x0f,  //8
        0x0b,  //9
        
};
/*  段码高8(右) */
static uint8_t num_H[10] = {
        0x07,
        0x06,
        0x03,
        0x07,//3
        0x06,//4
        0x05, //5
        0x05, //
        0x07, //7
        0x07, //8
        0x07, //9
};

void Lcd_clear(void)
{
        CW_LCD->RAM0 = 0;
  CW_LCD->RAM1 = 0;
  CW_LCD->RAM8 = 0;
  CW_LCD->RAM9 = 0;
}
void show_nums(uint32_t num)
{
        uint8_t i=0;
        uint8_t j;
        uint32_t temp;
        temp = num;
        //空显示
        Lcd_clear();
        if(temp == 0)
                show_num(0,0,0);
        while(temp>0)
        {
                j = temp%10;
                show_num(i,j,0);
                temp /=10;
                i++;
        }
}

/**
*功能:显示数字到LCD段码屏上
*输入参数1:显示在哪个位上7-0
*输入参数2:需要显示数字
*输入参数3:是否需要显示小数点
*/

void show_num(uint8_t wei, uint8_t num, uint8_t doit)
{
        uint8_t temp_H;
        temp_H = num_H[num];
        if(0 != doit)
        {
                temp_H  = temp_H + 8 ; //第四位置1显示小数点
        }

        switch(wei)
        {
                case 7:
                {
                                //显示第7个数码管
                        CW_LCD->RAM0 |= temp_H  <<8 | num_L[num];
                        break;
                }
                case 6:
                {
                        //显示第6个数码管
                        CW_LCD->RAM0 |= (temp_H<<8 | num_L[num]) <<16;
                        break;
                }
                case 5:
                {
                        //显示第5个数码管
                        CW_LCD->RAM1 |= num_L[num];
                        CW_LCD->RAM8 |= temp_H;
                        break;
                }
                case 4:
                {
                        //显示第4个数码管
                        CW_LCD->RAM8 |= temp_H<<16 | num_L[num]<<8;
                        break;
                }
                case 3:
                {
                        //显示第3个数码管
                        CW_LCD->RAM8 |= num_L[num]<<24;
      CW_LCD->RAM9 |= temp_H;
                        break;
                }
                case 2:
                {
                        //显示第2个数码管
                        CW_LCD->RAM9 |= temp_H<<16 | num_L[num]<<8;
                        break;
                }
                case 1:
                {
                        //显示第1个数码管
                        CW_LCD->RAM1 |= temp_H<<8;
                        CW_LCD->RAM9 |= num_L[num]<<24;
                        break;
                }
                case 0:
                {
                        //显示第0个数码管
                        CW_LCD->RAM1 |= temp_H<<24 | num_L[num]<<16;
                        break;
                }
        }
                                
}

void LCD_Configuration(void)
{
    LCD_InitTypeDef LCD_InitStruct = {0};

    LCD_InitStruct.LCD_Bias = LCD_Bias_1_3;
    LCD_InitStruct.LCD_ClockSource = LCD_CLOCK_SOURCE_LSI;
    LCD_InitStruct.LCD_Duty = LCD_Duty_1_4;
    LCD_InitStruct.LCD_ScanFreq = LCD_SCAN_FREQ_128HZ;
    LCD_InitStruct.LCD_VoltageSource = LCD_VoltageSource_Internal;

    __RCC_LCD_CLK_ENABLE();
    RCC_LSI_Enable();
    LCD_Init(&LCD_InitStruct);     //基本配置
    // BTL004 LCD 对应的连接
    //PA12 COM3
    //PA11 COM2
    //PA10 COM1
    //PA09 COM0
    //PA08 SEG0
    //PC09 SEG1
    //PC08 SEG2
    //PC07 SEG3
    //PC06 SEG4
    //PD15 SEG32
    //PD14 SEG33
    //PD13 SEG34
    //PD12 SEG35
    //PD11 SEG36
    //PD10 SEG37
    //PD09 SEG38
    //PD08 SEG39
    //PB15 SEG5
    //PB14 SEG6
    //PB13 SEG7
    // 分配引脚
    LCD_COMConfig(LCD_COM0 | LCD_COM1 | LCD_COM2 | LCD_COM3, ENABLE);
    LCD_SEG0to23Config(0x0000FF, ENABLE);
    LCD_SEG32to55Config(0x0000FF,ENABLE);

    CW_LCD->RAM[0] = 0;
    CW_LCD->RAM[1] = 0;
    CW_LCD->RAM2 = 0;
    CW_LCD->RAM3 = 0;
    CW_LCD->RAM4 = 0;
    CW_LCD->RAM5 = 0;
    CW_LCD->RAM6 = 0;
    CW_LCD->RAM7 = 0;
    CW_LCD->RAM8 = 0;
    CW_LCD->RAM9 = 0;
    CW_LCD->RAM10 = 0;
    CW_LCD->RAM11 = 0;
    CW_LCD->RAM12 = 0;
    CW_LCD->RAM13 = 0;

    LCD_Cmd(ENABLE);
    CW_LCD->RAM0 = 0;
    LCD_ContrastConfig(LCD_Contrast_Level_6);
    LCD_DriveVoltageConfig(LCD_INRS_LEVEL_0);
}
3、功耗控制主要是通过进入深度睡眠模式来实现节能,并通过RTC的AWT模块来实现定时唤醒。在此模块中,我们配置了AWT时钟源为RTC_AWTSOURCE_FROM_RTC1HZ_1即1秒为单位的唤醒,我们可以通过RTC_AWTARR 唤醒定时器重载值,来实现以秒为单位的休眠时长。主要代码如下:
//进入低功耗设置
void entry_power(void)
{
//        //1,先判断是否上电复位
    RTC_InitTypeDef RTC_InitStruct = {0};
          RTC_AWTTypeDef RCT_AWTStruct = {0};
          RCC_LSE_Enable(RCC_LSE_MODE_OSC, RCC_LSE_AMP_NORMAL, RCC_LSE_DRIVER_NORMAL);  // 选择LSE为RTC时钟

          RTC_InitStruct.DateStruct.Day = 0x24;             //设置日期,DAY、MONTH、YEAR必须为BCD方式,星期为0~6,代表星期日,星期一至星期六
                RTC_InitStruct.DateStruct.Month = RTC_Month_June;
                RTC_InitStruct.DateStruct.Week = RTC_Weekday_Monday;
                RTC_InitStruct.DateStruct.Year = 0x23;

                RTC_InitStruct.TimeStruct.Hour = 0x11;         //设置时间,HOUR、MINIUTE、SECOND必须为BCD方式,用户须保证HOUR、AMPM、H24之间的关联正确性
                RTC_InitStruct.TimeStruct.Minute = 0x58;
                RTC_InitStruct.TimeStruct.Second = 0x59;
                RTC_InitStruct.TimeStruct.AMPM = 0;
                RTC_InitStruct.TimeStruct.H24 = 0;
                RTC_InitStruct.RTC_ClockSource = RTC_RTCCLK_FROM_LSE;
                RTC_Init(&RTC_InitStruct);    //
        //设置自动唤醒
         RCT_AWTStruct.AWT_ClockSource = RTC_AWTSOURCE_FROM_RTC1HZ_1;
         RCT_AWTStruct.AWT_ARRValue = 60;
         RTC_AWTConfig(&RCT_AWTStruct);
         RTC_AWTCmd(ENABLE);
         RCC_APBPeriphClk_Enable1(RCC_APB1_PERIPH_RTC, ENABLE);
         RTC_ITConfig(RTC_IT_AWTIMER, ENABLE);
}        
4、在主程序中,我们先初始基本外设后进行循环的采集——显示——休眠——唤醒来实现温湿度采集的目标,主程序主要代码如下:
int32_t main(void)
{
          uint16_t temp;
                int t[20];
                uint16_t h[20];
                RCC_Configuration();
                NVIC_Configuration();
                LCD_Configuration();
                InitTick(8000000);
                SHT30_Init();
                Lcd_clear();               
                SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
                entry_power();

    while(1)
    {
                        SHT30_Read_Humiture(t,h);
                        temp = t[0];
                        Lcd_clear();
                        show_num(2, temp/100,0);
                        show_num(1, (temp/10)%10,1);
                        show_num(0, temp%10,0);                        
                        temp = h[0];
                        show_num(7, temp/100,0);
                        show_num(6, (temp/10)%10,1);
                        show_num(5, temp%10,0);
                        CW_SYSCTRL->AHBEN_f.GPIOB  = 0;
                        __DSB();
                        __WFI();
                        SHT30_Init();
    }

}
【实现的效果】
我们设定60秒中唤醒进行一次温显度采集,实现了休眠电流为5uA,综合平均工作电流为13uA、平均功率为。基本满足了以电池供电的环境下的超长工作。


【讨论】
CW32L083集成了LCD控制器,可以实现数据采集、显示的超低功耗工作。非常适合用于电池供电的环境下工作。本次试验虽然获得了理想效果,但是还有一些可以改进的地方。
1、在待机中的主要电流产生是LCD屏产生的功耗,如果在特殊的环境下,不需要长时间显示,可以适时关闭LCD屏,这样可以节约差不多4uA的工作电流。启用按键来人工参与显示数据,这样又可以更进一步降低超机功耗。
2、在工作电流中,主要消耗的是SHT30的温度转换时产生的大电流。如果应用的生产环境,可以在等待温度转换时,降低MCU的主频或者进入sleep模式以降低能耗。


评论
forgot 2024-1-22 13:58 回复TA
有实物 
lin624719 2023-7-15 18:33 回复TA
有实物的楼主就是牛 
cooldog123pp 2023-7-12 12:44 回复TA
有实物就牛X! 
沙发
dami| | 2023-6-25 09:41 | 只看该作者
楼主牛B!
板凳
lulugl|  楼主 | 2023-6-25 11:32 | 只看该作者

大佬过奖了
地板
wzjhuohua| | 2023-6-25 14:27 | 只看该作者
我的目标是60uA应该很容易达到吧
5
lulugl|  楼主 | 2023-6-25 14:28 | 只看该作者
wzjhuohua 发表于 2023-6-25 14:27
我的目标是60uA应该很容易达到吧

很容易的。加油!
6
coody| | 2023-6-25 20:03 | 只看该作者
我用STC8H4K64TLCD LQFP64组的时钟+温度+湿度+北斗模块或电波钟模块校时(一天一次),非常省电,8个8段LCD,十几uA。
评论
forgot 2024-1-22 13:58 回复TA
赞 
7
lulugl|  楼主 | 2023-6-25 20:23 | 只看该作者
coody 发表于 2023-6-25 20:03
我用STC8H4K64TLCD LQFP64组的时钟+温度+湿度+北斗模块或电波钟模块校时(一天一次),非常省电,8个8段LCD ...

大佬技术非常牛,我还是一个小菜鸟,以后请大佬多多关照。
8
renzhen123| | 2023-7-3 00:02 | 只看该作者
学习了
9
lulugl|  楼主 | 2023-7-12 15:14 | 只看该作者

多谢大佬关注!
10
yuzhiguo1515| | 2023-7-14 11:44 | 只看该作者
谢谢分享,学习学习。
11
地瓜patch| | 2023-7-15 21:37 | 只看该作者
我做过低功耗温湿度计,休眠在nA
12
lulugl|  楼主 | 2023-7-16 08:34 | 只看该作者
地瓜patch 发表于 2023-7-15 21:37
我做过低功耗温湿度计,休眠在nA

优秀的芯片跟设计者非常多,还请大佬多指点一下。**能分享一下大栳经验,让我们这些晚辈学习一下。
13
AdaMaYun| | 2025-08-04 16:27 | 只看该作者
不愧是我一直努力往后翻找,楼主厉害,学习
14
星辰大海不退缩| | 2024-1-21 15:35 | 只看该作者
CW32L083集成了LCD控制器,可以实现数据采集、显示的超低功耗工作
15
jf101| | 2024-1-27 14:22 | 只看该作者
综合平均工作电流为13uA这个功率非常低
16
AdaMaYun| | 2024-1-27 16:08 | 只看该作者
这个屏幕应该也消耗不大
17
OKAKAKO| | 2024-1-27 16:29 | 只看该作者
8位LCD段码屏功耗应该不高
18
LOVEEVER| | 2024-1-27 17:54 | 只看该作者
功耗控制主要是通过进入深度睡眠模式来实现节能
19
小夏天的大西瓜| | 2024-1-27 20:54 | 只看该作者
重点的低功耗的功率计算如何统计的?
20
szt1993| | 2024-2-25 16:34 | 只看该作者
硬件:CW32L083VxTx StartKit 开发板,板载有8位LCD段码屏。
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

825

帖子

12

粉丝
回潮是什么意思 多宝鱼是什么鱼 什么时候不能喷芸苔素 pku什么意思 东吴是现在的什么地方
荨麻疹需要注意什么 力不从心的意思是什么 头出汗多是什么原因 十一月二十是什么星座 乌龟王八甲鱼鳖有什么区别
卵巢囊性暗区是什么意思 冰柜什么牌子好 什么样的人爱长结节 哮喘吃什么药好 福鼎白茶属于什么茶
小孩办理护照需要什么材料 册那是什么意思 什么球不能踢脑筋急转弯 文艺范是什么意思 怕金森是什么症状
马日冲鼠是什么意思hcv9jop8ns0r.cn 太原有什么特产hcv9jop2ns6r.cn 乔迁新居送什么礼物jasonfriends.com 大材小用是什么生肖hcv8jop2ns4r.cn 八点半是什么时辰aiwuzhiyu.com
内能与什么因素有关hcv7jop5ns2r.cn 怀孕两个月出血是什么原因inbungee.com 象牙有什么作用与功效hcv7jop4ns5r.cn 只羡鸳鸯不羡仙是什么意思hcv8jop8ns6r.cn 膝盖疼痛挂什么科hcv8jop0ns0r.cn
走路脚心疼是什么原因hcv9jop6ns1r.cn 空指什么生肖hcv7jop9ns3r.cn 薄荷绿是什么颜色hcv9jop1ns2r.cn 宫保鸡丁宫保是指什么hcv8jop4ns6r.cn 龙骨是什么hcv9jop4ns0r.cn
第三者责任险是什么意思hcv8jop4ns8r.cn 均匀是什么意思hcv8jop3ns0r.cn 溯溪是什么意思hcv9jop0ns7r.cn 气血不足吃什么调理hcv8jop1ns2r.cn 虎鼠不结亲是什么意思hcv9jop3ns3r.cn
百度