วิธีเชื่อมต่อ HX711 ADC กับ NRF52832

1. บทนำ

วาระการประชุมคืองานในการพัฒนาโปรโตคอลการสื่อสารสำหรับไมโครคอนโทรลเลอร์ nrf52832 พร้อมด้วยสเตรนเกจแบบจีนฮาล์ฟบริดจ์สองตัว

งานนี้กลายเป็นว่าไม่ใช่เรื่องง่าย เนื่องจากฉันต้องเผชิญกับการขาดข้อมูลที่เข้าใจได้ มีโอกาสมากขึ้นที่ "รากเหง้าแห่งความชั่วร้าย" จะอยู่ใน SDK จาก Nordic Semiconductor เอง - การอัปเดตเวอร์ชันอย่างต่อเนื่อง ความซ้ำซ้อนและฟังก์ชันการทำงานที่ทำให้เกิดความสับสน ฉันต้องเขียนทุกอย่างตั้งแต่เริ่มต้น

ฉันคิดว่าหัวข้อนี้ค่อนข้างเกี่ยวข้องโดยพิจารณาจากข้อเท็จจริงที่ว่าชิปนี้มีสแต็ก BLE และ "สารพัด" ทั้งชุดสำหรับโหมดประหยัดพลังงาน แต่ฉันจะไม่ลงลึกเข้าไปในส่วนทางเทคนิคมากเกินไปเนื่องจากมีการเขียนบทความมากมายในหัวข้อนี้

2. รายละเอียดโครงการ

วิธีเชื่อมต่อ HX711 ADC กับ NRF52832

เหล็ก:

  • Adafruit Feather nRF52 Bluefruit LE (อะไรเกิดขึ้นที่มือ)
  • HX711 เอดีซี
  • สเตรนเกจจีน 2 ชิ้น (50x2 กก.)
  • โปรแกรมเมอร์ ST-LINK V2

ซอฟต์แวร์:

  • IDE VSCODE
  • NRF SDK16
  • 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 (อัตราบอด 115200, TX - 6 พิน, RX - 8 พิน) การตั้งค่าทั้งหมดอยู่ใน sdk_config.h

วิธีเชื่อมต่อ HX711 ADC กับ NRF52832

ผลการวิจัย

ขอขอบคุณทุกท่านที่ให้ความสนใจ ฉันหวังว่าบทความนี้จะมีประโยชน์และจะช่วยลดเวลาอันมีค่าสำหรับนักพัฒนาในการค้นหาวิธีแก้ไข ฉันอยากจะบอกว่าแนวทางทางเทคนิคที่ Nordic ใช้ในแพลตฟอร์มนั้นค่อนข้างน่าสนใจจากมุมมองของประสิทธิภาพการใช้พลังงาน

PS

โครงการยังอยู่ระหว่างการพัฒนา ดังนั้นหากหัวข้อนี้เป็นที่สนใจ ในบทความถัดไป ฉันจะพยายามอธิบายอัลกอริทึมสำหรับการสอบเทียบเซ็นเซอร์น้ำหนัก รวมถึงการเชื่อมต่อสแตก BLE

วัสดุ

ที่มา: will.com

เพิ่มความคิดเห็น