Πώς να συνδέσετε το HX711 ADC στο NRF52832

1. Εισαγωγή

Στην ημερήσια διάταξη ήταν η ανάπτυξη ενός πρωτοκόλλου επικοινωνίας για τον μικροελεγκτή nrf52832 με δύο κινεζικούς μετρητές τάσης μισής γέφυρας.

Το εγχείρημα αποδείχθηκε ότι δεν ήταν εύκολο, καθώς αντιμετώπισα έλλειψη οποιασδήποτε κατανοητής πληροφορίας. Είναι πιο πιθανό ότι η «ρίζα του κακού» βρίσκεται στο SDK από την ίδια τη Nordic Semiconductor - συνεχείς ενημερώσεις έκδοσης, κάποια πλεονασμός και μπερδεμένη λειτουργικότητα. Έπρεπε να γράψω τα πάντα από την αρχή.

Νομίζω ότι αυτό το θέμα είναι αρκετά σχετικό με βάση το γεγονός ότι αυτό το τσιπ έχει μια στοίβα BLE και μια ολόκληρη σειρά από "καλούδια" για λειτουργία εξοικονόμησης ενέργειας. Αλλά δεν θα μπω πολύ βαθιά στο τεχνικό μέρος, καθώς έχουν γραφτεί πολλά άρθρα σχετικά με αυτό το θέμα.

2. Περιγραφή έργου

Πώς να συνδέσετε το HX711 ADC στο NRF52832

Σίδερο:

  • Adafruit Feather nRF52 Bluefruit LE (τι συνέβη στο χέρι)
  • HX711 ADC
  • Κινεζικοί μετρητές καταπόνησης 2 τεμ. (50x2 kg)
  • Προγραμματιστής ST-LINK V2

Λογισμικό:

  • IDE VSCODE
  • NRF SDK 16
  • OpenOCD
  • Προγραμματιστής 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); 

// ενεργοποιήστε το gpiote

Μετά από αυτό, αρχικοποιούμε τη μονάδα 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 (baud rate 115200, TX - 6 pins, RX - 8 pins) όλες οι ρυθμίσεις είναι στο sdk_config.h

Πώς να συνδέσετε το HX711 ADC στο NRF52832

Ευρήματα

Σας ευχαριστώ όλους για την προσοχή σας, ελπίζω αυτό το άρθρο να είναι χρήσιμο και να μειώσει τον πολύτιμο χρόνο για τους προγραμματιστές να βρουν μια λύση. Θέλω να πω ότι η τεχνική προσέγγιση που χρησιμοποιεί η Nordic στις πλατφόρμες της είναι αρκετά ενδιαφέρουσα από την άποψη της ενεργειακής απόδοσης.

PS

Το έργο είναι ακόμα υπό ανάπτυξη, οπότε αν αυτό το θέμα παρουσιάζει ενδιαφέρον, στο επόμενο άρθρο θα προσπαθήσω να περιγράψω τον αλγόριθμο για τη βαθμονόμηση αισθητήρων βάρους, καθώς και τη σύνδεση της στοίβας BLE.

Υλικά

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο