Ahoana ny fomba hampifandraisana ny HX711 ADC amin'ny NRF52832

1. Fampidirana

Ao amin'ny fandaharam-potoana dia ny andraikitry ny famolavolana protocole fifandraisana ho an'ny microcontroller nrf52832 miaraka amin'ny mari-pandrefesana sinoa tapa-tetezana roa.

Tsy mora ilay asa, satria niatrika tsy fahampian'ny fampahalalana azo takarina aho. Azo inoana kokoa fa ny "fakan'ny faharatsiana" dia ao amin'ny SDK avy amin'ny Nordic Semiconductor mihitsy - fanavaozam-baovao tsy tapaka, famerenam-bola ary fampiasa mampisafotofoto. Tsy maintsy nanoratra ny zava-drehetra hatrany am-boalohany aho.

Heveriko fa tena manan-danja ity lohahevitra ity mifototra amin'ny zava-misy fa ity puce ity dia manana stack BLE sy andiana "tsara" ho an'ny fomba fitsitsiana angovo. Saingy tsy hiditra lalina amin'ny ampahany ara-teknika aho, satria lahatsoratra maro no nosoratana momba ity lohahevitra ity.

2. Famariparitana ny tetikasa

Ahoana ny fomba hampifandraisana ny HX711 ADC amin'ny NRF52832

vy:

  • Adafruit Feather nRF52 Bluefruit LE (inona no teo an-tanana)
  • HX711 ADC
  • Fandrefesana Sinoa 2 pcs. (50x2 kg)
  • Programme ST-LINK V2

Rindrambaiko:

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

Ao anatin'ny tetikasa iray ny zava-drehetra, mila manitsy fotsiny ny Makefile ianao (farito ny toerana misy ny SDK).

3. Famaritana ny kaody

Hampiasa ny maody GPIOTE izahay mba hiasa miaraka amin'ny periferika mifototra amin'ny famatorana ny asa sy ny hetsika, ary koa ny maody PPI mba hamindrana angona avy amin'ny periferika iray mankany amin'ny iray hafa tsy misy fandraisana anjaran'ny processeur.

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

Izahay dia manamboatra ny tsipika fampifanarahana PD_SCL mankany amin'ny famoahana hamokatra pulses amin'ny faharetan'ny 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);//Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΉΠΌΠ΅Ρ€
}
 

Ampifanarahintsika ny tsipika data DOUT mba hamakiana ny toetry ny fahavononana HX711; raha misy ny haavony ambany, dia misy mpitantana iray izay manafoana ny interrupt ary manomboka fameram-potoana hamokatra pulses famantaranandro amin'ny famoahana 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); 

// avelao ny gpiote

Aorian'izany dia manomboka ny maody PPI izahay ary mampifandray ny fameram-potoana amin'ny famoahana PD_SCL mba hamoronana pulses amin'ny faharetan'ny 10 ΞΌs rehefa misy hetsika fampitahana, ary velomy koa ny maody 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);// срабатываСт ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ

Manomboka ny fameram-potoana aotra sy ny mpitantana azy.

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

Ny zavatra mahaliana indrindra dia mitranga amin'ny mpandrindra fameram-potoana. Ny fe-potoana pulse dia 20 ΞΌs. Liana amin'ny pulses hafahafa izahay (manaraka ny sisiny miakatra) ary raha tsy mihoatra ny 24 ny isany, ary misy hetsika 48. Ho an'ny hetsika hafahafa tsirairay dia vakiana ny DOUT

Avy amin'ny datasheet dia manaraka fa ny isan'ny pulses dia tsy maintsy 25, fara fahakeliny, izay mifanitsy amin'ny tombony 128 (ao amin'ny fehezan-dalΓ na nampiasa 25 pulses), izany dia mitovy amin'ny 50 timer zava-nitranga, izay manondro ny faran'ny data frame.

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

Aorian'izany dia vonoinay ny fameram-potoana ary asio ny angon-drakitra (araka ny datasheet) ary mamadika ny fomba fanjifana herinaratra ambany ny 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);
}

Manantena ny fisehoan-javatra avy amin'ny fameram-potoana RTC miaraka amin'ny elanelana 10 s (araka ny fanapahan-kevitrao izany) ary atombohy ny HX711 amin'ny mpandrindra, ka miteraka fahatapahana amin'ny tsipika DOUT.

Misy teboka iray hafa, ny logs dia mivoaka amin'ny alΓ lan'ny UART (baud rate 115200, TX - 6 pins, RX - 8 pins) dia ao amin'ny sdk_config.h ny setup rehetra.

Ahoana ny fomba hampifandraisana ny HX711 ADC amin'ny NRF52832

hitany

Misaotra anareo rehetra tamin'ny fifantohanao, manantena aho fa hahasoa ity lahatsoratra ity ary hampihena ny fotoana sarobidy ho an'ny mpamorona hahita vahaolana. Te-hilaza aho fa ny fomba fiasa ara-teknika ampiasain'i Nordic amin'ny sehatra misy azy dia mahaliana tokoa raha jerena ny fahombiazan'ny angovo.

Sal

Mbola eo an-dalam-pandrosoana ny tetikasa, ka raha mahaliana ity lohahevitra ity, amin'ny lahatsoratra manaraka dia hiezaka ny hamaritana ny algorithm amin'ny fandrefesana ny sensor sensor aho, ary koa ny fampifandraisana ny stack BLE.

fitaovana

Source: www.habr.com

Add a comment