如何将HX711 ADC连接到NRF52832

1.简介



议程上的任务是为具有两个半桥中国式应变仪的nrf52832微控制器开发通信协议。



事实证明,这项任务并不容易,因为我面临着缺乏任何可理解的信息的问题。Nordic Semiconductor的SDK本身更可能是“祸根”-这是不断的版本更新,某些冗余和功能混乱。我必须从头开始编写所有内容。



考虑到该芯片具有BLE堆栈和整套省电模式的“优点”,我认为该主题非常相关。但由于涉及该主题的许多文章,因此我不会深入探讨技术部分。



2.项目说明



图片



铁:



  • Adafruit Feather nRF52 Bluefruit LE(发生了什么事)
  • ADC HX711
  • 中国应变片2个 (50x2公斤)
  • 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 , RX — 8 ) sdk_config.h



图片





谢谢大家的关注,希望本文对您有所帮助,并为寻求解决方案的开发人员节省宝贵的时间。我想说的是,北欧能源在其平台中使用的技术方法在能源效率方面非常有趣。



聚苯乙烯



该项目仍在开发中,因此,如果在下一篇文章中对该主题感兴趣,我将尝试描述用于校准重量传感器以及连接BLE堆栈的算法。



用料






All Articles