Bagaimana untuk menyambungkan HX711 ADC ke NRF52832

1. Pengenalan

Dalam agenda ialah tugas membangunkan protokol komunikasi untuk mikropengawal nrf52832 dengan dua tolok terikan Cina separuh jambatan.

Tugas itu ternyata tidak mudah, kerana saya berhadapan dengan kekurangan maklumat yang boleh difahami. Kemungkinan besar bahawa "akar kejahatan" berada dalam SDK daripada Nordic Semiconductor itu sendiri - kemas kini versi berterusan, beberapa redundansi dan fungsi yang mengelirukan. Saya terpaksa menulis segala-galanya dari awal.

Saya rasa topik ini agak relevan berdasarkan fakta bahawa cip ini mempunyai timbunan BLE dan satu set keseluruhan "gula-gula" untuk mod penjimatan tenaga. Tetapi saya tidak akan pergi terlalu mendalam ke bahagian teknikal, kerana banyak artikel telah ditulis mengenai topik ini.

2. Penerangan tentang projek

Bagaimana untuk menyambungkan HX711 ADC ke NRF52832

besi:

  • Adafruit Feather nRF52 Bluefruit LE (apa yang berlaku di tangan)
  • ADC HX711
  • Tolok terikan Cina 2 pcs. (50x2 kg)
  • Pengaturcara ST-LINK V2

Lembut:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Pengaturcara ST-LINK V2

Semuanya ada dalam satu projek, anda hanya perlu tweak Makefile (nyatakan lokasi SDK anda).

3. Penerangan tentang kod

Kami akan menggunakan modul GPIOTE untuk bekerja dengan persisian berdasarkan pengikatan tugas dan acara, serta modul PPI untuk memindahkan data dari satu persisian ke peranti lain tanpa penyertaan pemproses.

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);//настраСваСм Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄

Kami mengkonfigurasi baris penyegerakan PD_SCL kepada output untuk menjana denyutan dengan tempoh 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);//Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
}
 

Kami mengkonfigurasi baris data DOUT untuk membaca keadaan kesediaan HX711; jika terdapat tahap rendah, pengendali dicetuskan di mana kami melumpuhkan gangguan dan memulakan pemasa untuk menjana denyutan jam pada output 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); 

// dayakan gpiote

Selepas itu, kami memulakan modul PPI dan menyambung pemasa kami ke output PD_SCL untuk menjana denyutan dengan tempoh 10 ΞΌs apabila peristiwa perbandingan berlaku, dan juga menghidupkan modul 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);// срабатываСт ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ

Kami memulakan pemasa sifar dan pengendalinya.

  if(m_counter%2 != 0 && m_counter<=48){
       buffer <<= 1;// пСрСмСнная считанных Π΄Π°Π½Ρ‹Ρ…
        c_counter++;// счСтчик ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ…  ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠ²
           if(nrf_gpio_pin_read(DOUT))buffer++;//считываСм состояниС Π²Ρ…ΠΎΠ΄Π°
   }

Perkara yang paling menarik berlaku dalam pengendali pemasa. Tempoh nadi ialah 20 ΞΌs. Kami berminat dengan nadi ganjil (di sepanjang tepi meningkat) dan dengan syarat bilangannya tidak lebih daripada 24, dan terdapat 48 peristiwa. Bagi setiap peristiwa ganjil, DOUT dibaca

Daripada lembaran data ia mengikuti bahawa bilangan denyutan mestilah sekurang-kurangnya 25, yang sepadan dengan keuntungan sebanyak 128 (dalam kod yang saya gunakan 25 denyutan), ini bersamaan dengan 50 peristiwa pemasa, yang menunjukkan akhir bingkai data.

 ++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
       }
   

Selepas ini, kami mematikan pemasa dan memproses data (mengikut lembaran data) dan menukar HX711 kepada mod penggunaan kuasa rendah.


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);
}

Kami menjangkakan peristiwa daripada pemasa RTC dengan selang 10 saat (ini mengikut budi bicara anda) dan melancarkan HX711 dalam pengendali, menyebabkan gangguan pada garisan DOUT.

Terdapat satu lagi titik, log dikeluarkan melalui UART (kadar baud 115200, TX - 6 pin, RX - 8 pin) semua tetapan berada dalam sdk_config.h

Bagaimana untuk menyambungkan HX711 ADC ke NRF52832

Penemuan

Terima kasih semua atas perhatian anda, saya harap artikel ini berguna dan akan mengurangkan masa yang berharga untuk pembangun mencari penyelesaian. Saya ingin mengatakan bahawa pendekatan teknikal yang digunakan oleh Nordic dalam platformnya agak menarik dari sudut kecekapan tenaga.

PS

Projek ini masih dalam pembangunan, jadi jika topik ini menarik, dalam artikel seterusnya saya akan cuba menerangkan algoritma untuk menentukur sensor berat, serta menyambungkan timbunan BLE.

bahan-bahan

Sumber: www.habr.com

Tambah komen