如何将 HX711 ADC 连接到 NRF52832

1。 介绍

议程上的任务是为带有两个半桥中国应变片的 nrf52832 微控制器开发通信协议。

事实证明,这项任务并不容易,因为我缺乏任何可理解的信息。 更有可能的是,“万恶之源”在于 Nordic Semiconductor 本身的 SDK——不断的版本更新、一些冗余和令人困惑的功能。 我必须从头开始编写所有内容。

我认为这个主题非常相关,因为该芯片具有 BLE 堆栈和一整套用于节能模式的“好东西”。 但我不会太深入地讨论技术部分,因为已经有很多关于这个主题的文章了。

2、项目描述

如何将 HX711 ADC 连接到 NRF52832

铁:

  • Adafruit Feather nRF52 Bluefruit LE(手边发生的事)
  • HX711 模数转换器
  • 中国应变片2个。 (50x2 公斤)
  • 编程器ST-LINK V2

软件:

  • 集成开发环境代码
  • NRF SDK 16
  • 开放式强迫症
  • 编程器ST-LINK V2

一切都在一个项目中,您只需调整 Makefile(指定 SDK 的位置)。

3.代码说明

我们将使用 GPIOTE 模块基于任务和事件的绑定与外设配合使用,并使用 PPI 模块将数据从一个外设传输到另一个外设,而无需处理器的参与。

ret_code_t err_code;
   err_code = nrf_drv_gpiote_out_init(PD_SCK, &config);//настраеваем на выход
   nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false);//будем передергивать пин для импульса
   err_code = nrf_drv_gpiote_out_init(PD_SCK, &config);//настраеваем на выход

我们将 PD_SCL 同步线配置到输出以生成持续时间为 10 μs 的脉冲。

   nrf_drv_gpiote_in_config_t  gpiote_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(false);// переход уровня с высокого на низкий
   nrf_gpio_cfg_input(DOUT, NRF_GPIO_PIN_NOPULL);// на вход без подтяжки
   err_code = nrf_drv_gpiote_in_init(DOUT, &gpiote_config, gpiote_evt_handler); 

static void gpiote_evt_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
    nrf_drv_gpiote_in_event_disable(DOUT);//отключаем прерывание
    nrf_drv_timer_enable(&m_timer0);//включаем таймер
}
 

我们配置 DOUT 数据线来读取 HX711 的就绪状态;如果有低电平,则会触发一个处理程序,在该处理程序中我们禁用中断并启动计时器以在 PD_SCL 输出处生成时钟脉冲。

 err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel1);
   APP_ERROR_CHECK(err_code);
   err_code = nrf_drv_ppi_channel_assign(m_ppi_channel1,                                         nrf_drv_timer_event_address_get(&m_timer0, NRF_TIMER_EVENT_COMPARE0),                                           nrf_drv_gpiote_out_task_addr_get(PD_SCK));// подключаем таймер к выходу
   APP_ERROR_CHECK(err_code);
   err_code = nrf_drv_ppi_channel_enable(m_ppi_channel1);// включаем канал
   APP_ERROR_CHECK(err_code);
   nrf_drv_gpiote_out_task_enable(PD_SCK); 

// 启用GPIO

之后,我们初始化 PPI 模块,并将定时器连接到 PD_SCL 输出,以在发生比较事件时生成持续时间为 10 μs 的脉冲,并打开 GPIOTE 模块。


nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;// по умолчанию
   timer_cfg.frequency = NRF_TIMER_FREQ_1MHz;// тактируем на частоте 1Мгц
   ret_code_t err_code = nrf_drv_timer_init(&m_timer0, &timer_cfg, timer0_event_handler);
   APP_ERROR_CHECK(err_code);
   nrf_drv_timer_extended_compare(&m_timer0,
                                  NRF_TIMER_CC_CHANNEL0,
                                  nrf_drv_timer_us_to_ticks(&m_timer0,
                                                            10),
                                  NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
                                  true);// срабатывает по сравнению

我们初始化零计时器及其处理程序。

  if(m_counter%2 != 0 && m_counter<=48){
       buffer <<= 1;// переменная считанных даных
        c_counter++;// счетчик положительных  импульсов
           if(nrf_gpio_pin_read(DOUT))buffer++;//считываем состояние входа
   }

最有趣的事情发生在计时器处理程序中。 脉冲周期为20μs。 我们对奇数脉冲(沿上升沿)感兴趣,并且其数量不超过 24 个,并且有 48 个事件。对于每个奇数事件,读取 DOUT

从数据表中可以看出,脉冲数必须至少为 25,这对应于 128 的增益(在代码中我使用了 25 个脉冲),这相当于 50 个定时器事件,这表明数据帧的结束。

 ++m_counter;// счетчик событий
if(m_counter==50){
      nrf_drv_timer_disable(&m_timer0);// отключаем таймер
       m_simple_timer_state = SIMPLE_TIMER_STATE_STOPPED;//
       buffer = buffer ^ 0x800000;
       hx711_stop();//jотключаем hx711
       }
   

之后,我们关闭定时器并处理数据(根据数据表)并将HX711切换到低功耗模式。


static void repeated_timer_handler(void * p_context)
{
   nrf_drv_gpiote_out_toggle(LED_2);
   if(m_simple_timer_state == SIMPLE_TIMER_STATE_STOPPED){
      	hx711_start();// включаем hx711
       nrf_drv_gpiote_out_toggle(LED_1);
       m_simple_timer_state = SIMPLE_TIMER_STATE_STARTED;
   }
  
}
/**@brief Create timers.
*/
static void create_timers()
{
   ret_code_t err_code;
 
   // Create timers
   err_code = app_timer_create(&m_repeated_timer_id,
                               APP_TIMER_MODE_REPEATED,
                               repeated_timer_handler);
   APP_ERROR_CHECK(err_code);
}

我们预计来自 RTC 定时器的事件间隔为 10 秒(这由您自行决定),并在处理程序中启动 HX711,从而在 DOUT 线上产生中断。

还有一点,日志是通过UART输出的(波特率115200,TX - 6针,RX - 8针)所有设置都在sdk_config.h中

如何将 HX711 ADC 连接到 NRF52832

发现

感谢大家的关注,我希望本文对您有所帮助,并减少开发人员寻找解决方案的宝贵时间。 我想说,从能源效率的角度来看,Nordic 在其平台中使用的技术方法非常有趣。

PS

该项目仍在开发中,因此如果您对此主题感兴趣,我将在下一篇文章中尝试描述用于校准重量传感器以及连接 BLE 堆栈的算法。

物料

来源: habr.com

添加评论