391|3

322

帖子

0

资源

一粒金砂(中级)

【Gravity:AS7341测评】色温感知测量之二 Arduino代码和原理简析 [复制链接]

 

1、拿到模块就开始测试。从官网下载的是一个arduino的开发包。因为最近没有测试arduino开发板,连软件就KAO掉了,这次下载最新版后发现,新增加开发板进入龟速阶段,搞了5天都没有把bsp给搞定,因为选择的arduino 101放到了github的raw data库中,所以,文件小的还ok,大文件就总这样。虽然,很不爽。

不过,看看伊朗码农的github账号直接给封禁,以及哈工大的matlab账户直接被封就知道,包括微微入主以后的github,开放精神是有前提条件的,不用就不用了。总之是github给了gitee发展机会。

 

2. 但是代码还是要分析一下的,

加载getflick.ino程序,

#include "DFRobot_AS7341.h"
/*!
 * @brief Construct the function
 * @param pWire IC bus pointer object and construction device, can both pass or not pass parameters, Wire in default.
 */
DFRobot_AS7341 as7341;


void setup(void)
{
  Serial.begin(115200);
  //Detect if IIC can communicate properly
  while (as7341.begin() != 0) {
    Serial.println("IIC init failed, please check if the wire connection is correct");
    delay(1000);
  }
}

void loop(void){
  uint8_t freq = 0;
  //Read the value of register flicker, through which the flicker frequency of the light source can be predicted
  freq = as7341.readFlickerData();
  if (freq == 1) {
    Serial.println("Unknown frequency");
  } else if (freq == 0) {
    Serial.println("No flicker");
  } else {
    Serial.print(freq);
    Serial.println("Hz");
  }
}

从上面可以看出arduino封装以后的代码是非常简单直观,可以直接读出LED的频闪频率。

用于测试,还提供了一个50Hz和60Hz频闪的发生工具。

void setup() {
  pinMode(10, OUTPUT);
}

void loop() {
  digitalWrite(10, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(5);
  digitalWrite(10, LOW);   // turn the LED on (HIGH is the voltage level)
  delay(5);
}

3、代码分析

那么在没有资料的情况下,如何不依赖arduino板子搞呢,就需要看一下驱动程序。

可用的外部程序如下;

/
  uint8_t readFlickerData();
  /**
   * @brief Set measurement mode 
   * @param mode
   */
  void config(eMode_t mode);
  bool measureComplete();
  void setGpioMode(uint8_t mode);
  void enableSpectralMeasure(bool on);
  void enableLed(bool on);
  void controlLed(uint8_t current);
  bool interrupt();
  void setThreshold(uint16_t lowTh,uint16_t highTh);
  uint16_t getLowThreshold();
  uint16_t getHighThreshold();
  void enableSpectralInterrupt(bool on);
  void setIntChannel(uint8_t channel);
  void setAPERS(uint8_t num);
  uint8_t getIntSource();
  
  void clearInterrupt();
private:
  float getWtime();
  float getIntegrationTime();
  uint16_t getChannelData(uint8_t channel);
  
  
  void enableAS7341(bool on);
  
  void enableWait(bool on);
  void enableSMUX(bool on);
  void enableFlickerDetection(bool on);
  
  void setBank(uint8_t addr);
  
  void setGpio(bool connect);
  void setInt(bool connect);
  
  void enableSysInt(bool on);
  void enableFIFOInt(bool on);
  void enableSpectralInt(bool on);
  void enableFlickerInt(bool on);
  void F1F4_Clear_NIR();
  void F5F8_Clear_NIR();
  void FDConfig();
  void endSleep();
  void clearFIFO();
  void spectralAutozero();
  bool checkWtime();

其中的C代码初始化程序如下:

#include "DFRobot_AS7341.h"


DFRobot_AS7341::DFRobot_AS7341(TwoWire *pWire)
{
  _pWire = pWire;
  _address = 0x39;
} 
int DFRobot_AS7341::begin(eMode_t mode) 
{
  uint8_t buffer[2];
  _pWire->begin();
  _pWire->beginTransmission(_address);
  if(_pWire->endTransmission() != 0){
    DBG("");
    DBG("bus data access error"); DBG("");
    return ERR_DATA_BUS;
  }
  enableAS7341(true);
  measureMode = mode;
  return ERR_OK;
}

显然使用了two wire库函数,那么,就是使用I2C进行驱动访问的意思了,给出了I2C 地址_address = 0x39;

那么,使用其他板子对_address = 0x39,按照指令要求进行读写就可以了,这样就可以用nucleo板子尝试移植使用了。

如果只用arduino,那么评测就结束了。木有的玩了。

 

赞赏

1

查看全部赞赏


回复

751

帖子

2

资源

版主

可做一些颜色传感器的小Demo,这样就不无聊了~


回复

3184

帖子

1

资源

五彩晶圆(初级)

arduino现在还有人玩啊?感觉热度好像没有前几年高了。

个人签名人已离开,无事别找,找也找不到。

回复

1万

帖子

133

资源

管理员

个人签名

玩板看这里:

http://bbs.eeworld.com.cn/elecplay.html

EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/5 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表