那曲檬骨新材料有限公司

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

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

3天內不再提示

求一種基于Infineon的信息采集系統設計方案

冬至子 ? 來源:xinshuwei ? 作者:xinshuwei ? 2023-07-19 15:22 ? 次閱讀

項目簡介

此次項目主要是基于PSOC6 英飛凌 PSoC?62 with CAPSENSE? evaluation kit 實現OLED 顯示溫度、氣壓室內信息

整體框架如下:

1.jpg

1.通過板載的dap 和uart 進行串口log 打印及程序刷寫
2.通過I2C 進行BMP280 的驅動
3.通過I2C 進行oled SSD1306的顯示

實現步驟

1.rtt 中添加 軟件包

使能sensor 驅動 iic 驅動 uart驅動

2.默認的bmp280 包不能使用,由于使用最新的rt版本 不兼容,進行驅動層修改

#ifndef SENSOR_BS_BMP280_H__
#define SENSOR_BS_BMP280_H__
#include "drivers/sensor.h"
#include "bmp280.h"
#define BMP280_ADDR_DEFAULT BMP280_I2C_ADDR_SEC
#define BMP280_I2CBUS_NAME "i2c1"
int rt_hw_bmp280_init(const char *name, struct rt_sensor_config *cfg);
#endif
定義I2C bus名稱
定義BMP280 默認地址
硬件初始化

static struct rt_sensor_ops sensor_ops =
{
_bmp280_fetch_data,
_bmp280_control
};
int rt_hw_bmp280_init(const char *name, struct rt_sensor_config *cfg)
{
int result;
rt_sensor_t sensor_pres = RT_NULL, sensor_temp = RT_NULL;
result = _rt_bmp280_init(&cfg->intf);
if (result != RT_EOK)
{
LOG_E("_rt_bmp280_init err code: %d", result);
return -RT_ERROR;
}
else
{
sensor_pres = rt_calloc(1, sizeof(struct rt_sensor_device));
if (sensor_pres == RT_NULL)
{
LOG_E("rt_calloc error");
return -RT_ERROR;
}
sensor_pres->info.type = RT_SENSOR_TYPE_BARO;
sensor_pres->info.vendor = RT_SENSOR_VENDOR_BOSCH;
sensor_pres->info.name = "bmp280_pres";
sensor_pres->info.unit = RT_SENSOR_UNIT_PA;
sensor_pres->info.intf_type = RT_SENSOR_INTF_I2C;
sensor_pres->info.scale.range_max = SENSOR_PRES_RANGE_MAX;
sensor_pres->info.scale.range_min = SENSOR_PRES_RANGE_MIN;
//sensor_pres->info.period_min = 0;
rt_memcpy(&sensor_pres->config, cfg, sizeof(struct rt_sensor_config));
sensor_pres->ops = &sensor_ops;
result = rt_hw_sensor_register(sensor_pres, name, RT_DEVICE_FLAG_RDWR, (void *)RT_NULL);
if (result != RT_EOK)
{
LOG_E("device register err code: %d", result);
goto __exit;
}
sensor_temp = rt_calloc(1, sizeof(struct rt_sensor_device));
if (sensor_temp == RT_NULL)
{
LOG_E("rt_calloc error");
goto __exit;
}
sensor_temp->info.type = RT_SENSOR_TYPE_TEMP;
sensor_temp->info.vendor = RT_SENSOR_VENDOR_BOSCH;
sensor_temp->info.name = "bmp280_temp";
sensor_temp->info.unit = RT_SENSOR_UNIT_CELSIUS;
sensor_temp->info.intf_type = RT_SENSOR_INTF_I2C;
sensor_temp->info.scale.range_max = SENSOR_TEMP_RANGE_MAX;
sensor_temp->info.scale.range_min = SENSOR_TEMP_RANGE_MIN;
//sensor_temp->info.period_min = 0;
rt_memcpy(&sensor_temp->config, cfg, sizeof(struct rt_sensor_config));
sensor_temp->ops = &sensor_ops;
result = rt_hw_sensor_register(sensor_temp, name, RT_DEVICE_FLAG_RDWR, RT_NULL);
if (result != RT_EOK)
{
LOG_E("device register err code: %d", result);
goto __exit;
}
}
LOG_I("bmp280_sensor init success");
return RT_EOK;
__exit:
if (sensor_pres)
rt_free(sensor_pres);
if (sensor_temp)
rt_free(sensor_temp);
return -RT_ERROR;
}
rt_sensor_info 結構體改變了很多,需要根據sensor 驅動進行相應的修改
設置 bmp 280 更新速度

static rt_err_t _bmp280_set_odr(rt_sensor_t sensor, rt_uint32_t args)
{
int8_t rslt;
struct bmp280_config conf;
if(args==1||args==2||args==4||args==8||args==16||args==2048||args==BMP280_ODR_2000_MS||args==BMP280_ODR_4000_MS)
{
rslt = bmp280_get_config(&conf, &bmp);
if(rslt!=BMP280_OK)
{
print_rslt(" bmp280_get_config status", rslt);
return -RT_ERROR;
}
switch(args)
{
case 1 : conf.odr = BMP280_ODR_1000_MS; break;
case 2 : conf.odr = BMP280_ODR_500_MS; break;
case 4 : conf.odr = BMP280_ODR_250_MS; break;
case 8 : conf.odr = BMP280_ODR_125_MS; break;
case 16 : conf.odr = BMP280_ODR_62_5_MS; break;
case 2048 : conf.odr = BMP280_ODR_0_5_MS; break;
case BMP280_ODR_2000_MS : conf.odr = BMP280_ODR_2000_MS; break;
case BMP280_ODR_4000_MS : conf.odr = BMP280_ODR_4000_MS; break;
default: return -RT_ERROR;
}
rslt = bmp280_set_config(&conf, &bmp);
if(rslt!=BMP280_OK)
{
print_rslt(" bmp280_set_config status", rslt);
return -RT_ERROR;
}
return RT_EOK;
}
else
{
// LOG_E("only 1,2,4,8,16,2048,BMP280_ODR_2000_MS,BMP280_ODR_4000_MS could set");
return -RT_ERROR;
}
}
最新版本的sensor control 去掉了好多控制,做了相應的注釋

static rt_err_t _bmp280_control(struct rt_sensor_device *sensor, int cmd, void *args)
{
rt_err_t result = RT_EOK;
switch (cmd)
{
case RT_SENSOR_CTRL_GET_ID:
result = _bmp280_get_id(sensor,args);
break;
#if 0
case RT_SENSOR_CTRL_SET_RANGE:
result = -RT_ERROR;
break;
case RT_SENSOR_CTRL_SET_ODR:
result = _bmp280_set_odr(sensor,(rt_uint32_t)args & 0xffff);
break;
case RT_SENSOR_CTRL_SET_MODE:
break;
case RT_SENSOR_CTRL_SET_POWER:
result = _bmp280_set_POWER(sensor,(rt_uint32_t)args & 0xff);
break;
#endif
case RT_SENSOR_CTRL_SELF_TEST:
result = -RT_ERROR;
break;
default:
// LOG_E("only RT_SENSOR_CTRL_GET_ID,RT_SENSOR_CTRL_SET_POWER,RT_SENSOR_CTRL_SET_ODR could set");
return -RT_ERROR;
}
return result;
}
3.bmp280 app 初始化

#include
#include
#include
#include "sensor_bs_bmp280.h"
#define BMP_NAME "bmp280"
int bmp280_port(void)
{
struct rt_sensor_config cfg;
cfg.intf.dev_name = BMP280_I2CBUS_NAME;
rt_hw_bmp280_init("bmp280", &cfg);
return 0;
}
INIT_APP_EXPORT(bmp280_port);

1.jpg

上電log 打印可以看到device 已經注冊成功

4.oled 顯示驅動

oled 顯示通過u8g2進行驅動,這里參考ssd1306 I2C 初始化過程 代碼如下:

u8g2_t u8g2;
// Initialization
u8g2_Setup_ssd1306_i2c_128x64_noname_f( &u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay_rtthread);
u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_I2C_CLOCK, OLED_I2C_PIN_SCL);
u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_I2C_DATA, OLED_I2C_PIN_SDA);

顯示初始化前 ,先尋找驅動

rt_device_t temp_dev =RT_NULL;
  rt_device_t baro_dev =RT_NULL;
  rt_size_t res =0;
  temp_dev = rt_device_find(BMP_TEMP);
  if(temp_dev == RT_NULL)
  {
      rt_kprintf("can not find bmp280 tempn");
      return ;
  }
  baro_dev = rt_device_find(BMP_BARO);
  if(temp_dev == RT_NULL)
  {
      rt_kprintf("can not find bmp280 baron");
      return ;
  }
  if (rt_device_open(temp_dev, RT_DEVICE_FLAG_RDWR) != RT_EOK) {
      rt_kprintf("open device failed!n");
      return;
  }
  if (rt_device_open(baro_dev, RT_DEVICE_FLAG_RDWR) != RT_EOK) {
      rt_kprintf("open device failed!n");
      return;
  }

然后顯示線程的主循環中按一定的間隔進行sensor 數據讀取,然后更新顯示到oled 上

res = rt_device_read(temp_dev, 0, &temp_data, 1);
      if (res != 1) {
          rt_kprintf("read data failed!size is %dn", res);
          rt_device_close(temp_dev);
          return;
      }
      res = rt_device_read(baro_dev, 0, &baro_data, 1);
      if (res != 1) {
          rt_kprintf("read data failed!size is %dn", res);
          rt_device_close(baro_dev);
          return;
      }
      u8g2_ClearBuffer(&u8g2);
      u8g2_DrawStr(&u8g2, 12, 12, "psoc6 demo");
      temp_int =temp_data.data.temp;
      //sprintf(buf,"temp:%.2f C",temp_data.data.temp);
      sprintf(buf,"temp:%d.%d C",temp_int /10,temp_int %10);
      u8g2_DrawStr(&u8g2, 32, 40, buf);
      sprintf(buf,"baro:%.0fPa",baro_data.data.baro );
      u8g2_DrawStr(&u8g2, 32, 56, buf);
      u8g2_SendBuffer(&u8g2);
      rt_thread_mdelay(100);
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • I2C總線
    +關注

    關注

    8

    文章

    406

    瀏覽量

    61163
  • OLED顯示
    +關注

    關注

    1

    文章

    56

    瀏覽量

    17053
  • SSD1306
    +關注

    關注

    3

    文章

    40

    瀏覽量

    13676
  • BMP280
    +關注

    關注

    1

    文章

    20

    瀏覽量

    5775
  • RTThread
    +關注

    關注

    8

    文章

    132

    瀏覽量

    40999
收藏 人收藏

    評論

    相關推薦

    分享一種不錯的基于FPGA和USB的通用CCD采集系統設計方案

    提出一種基于FPGA和USB的通用CCD采集系統設計方案。該系統在不改變硬件的情況下可以采集多種
    發表于 04-22 06:23

    大神分享一種PPSM嵌入式RTOS中的窗口系統設計方案

    大神分享一種PPSM嵌入式RTOS中的窗口系統設計方案
    發表于 04-27 06:20

    一種多通道同步數據采集及壓縮系統設計方案  

    一種多通道同步數據采集及壓縮系統設計方案。  
    發表于 04-28 06:13

    一種多路模擬數字采集與處理系統設計方案

    一種多路模擬數字采集與處理系統設計方案
    發表于 04-28 07:04

    一種新型系統級可編程芯片的設計方案

    一種新型系統級可編程芯片的設計方案
    發表于 05-06 07:44

    一種直流固態功控系統設計方案

    一種基于CPLD控制的直流固態功控系統設計方案
    發表于 05-06 06:23

    一種智能電源模塊測試系統設計方案

    一種智能電源模塊測試系統設計方案
    發表于 05-10 06:35

    一種遠程智能垃圾桶報警系統設計方案

    一種遠程智能垃圾桶報警系統設計方案
    發表于 05-19 07:10

    一種智能物品清點系統設計方案

    一種智能物品清點系統設計方案
    發表于 05-20 07:29

    一種視頻檢測和遠程控制的嵌入式系統設計方案

    一種視頻檢測和遠程控制的嵌入式系統設計方案
    發表于 05-27 06:38

    大佬分享一種小型通信系統設計方案

    大佬分享一種小型通信系統設計方案
    發表于 05-28 06:13

    大佬分享一種多光譜可見光遙感圖像壓縮系統設計方案

    大佬分享一種多光譜可見光遙感圖像壓縮系統設計方案
    發表于 06-02 06:39

    一種陶瓷揚聲器系統的放大器設計方案

    一種陶瓷揚聲器系統的放大器設計方案
    發表于 06-04 07:10

    一種基于ARM的視頻監控系統設計方案

    本文介紹了一種基于ARM的視頻監控系統設計方案,采用軟壓縮算法,討論了系統的硬件和軟件設計。
    發表于 06-08 06:27

    一種基于單片機的簡易洗衣機系統仿真設計方案

    一種基于單片機的簡易洗衣機系統仿真設計方案
    發表于 01-17 08:09
    保单机百家乐破解方法| 百家乐官网赌博筹码| 皇冠网网址| 轮盘赌| 天镇县| 百家乐官网桩闲落注点| 百家乐官网微笑投注| 百家乐官网英皇娱乐网| 网络百家乐官网破解平台| 玩百家乐官网犯法| 百家乐官网怎么骗人| 百家乐官网必赢| 波音网百家乐合作| 尊龙百家乐娱乐网| 威尼斯人娱乐网上百家乐| 香港六合彩总公司| 耒阳市| 百家乐官网注册送10彩金| 百家乐官网tt赌场娱乐网规则 | 伊金霍洛旗| 网上百家乐官网正规代理| 女优百家乐官网的玩法技巧和规则| 百家乐娱乐城网站| 贝博百家乐的玩法技巧和规则| 大发888收获| 易胜博百家乐官网输| 赌场百家乐官网投注公式| 天博百家乐官网的玩法技巧和规则 | 长沙百家乐的玩法技巧和规则| 大发888真钱游戏下载到桌面| 天天乐娱乐| 百家乐官网破解的方法| 手机百家乐官网的玩法技巧和规则 | 太阳城现金网| 网络百家乐官网模拟投注| 做生意风水摆件| 威尼斯人娱乐场门票| 新金润娱乐城| 百家乐官网网站可信吗| 什么棋牌游戏能赚钱| 温州百家乐官网真人网|