如何將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 在其平台中使用的技術方法非常有趣。

聚苯乙烯

該專案仍在開發中,因此如果您對此主題感興趣,我將在下一篇文章中嘗試描述用於校準重量感測器以及連接 BLE 堆疊的演算法。

物料

來源: www.habr.com

添加評論