365 lines
12 KiB
C
365 lines
12 KiB
C
|
/********************************************************************
|
|||
|
Copyright (c) 2021 Xiangyu Medical Co.<EFBFBD><EFBFBD>Ltd. All rights reserved.
|
|||
|
FileName : drv_saadc.c
|
|||
|
Author : zhangdawei
|
|||
|
Version : V1.0
|
|||
|
Date :
|
|||
|
Note :
|
|||
|
History :
|
|||
|
********************************************************************/
|
|||
|
/* Includes ------------------------------------------------------*/
|
|||
|
#include "nrf_drv_ppi.h"
|
|||
|
#include "app_timer.h"
|
|||
|
#include "bsp_btn_ble.h"
|
|||
|
#include "drv_saadc.h"
|
|||
|
#include "timer.h"
|
|||
|
#include "string.h"
|
|||
|
#include "drv_uart.h"
|
|||
|
#include "nrf_drv_ppi.h"
|
|||
|
#include "IIR.h"
|
|||
|
/* Private define ------------------------------------------------*/
|
|||
|
/* Private typedef -----------------------------------------------*/
|
|||
|
#define SAMPLES_BUFFER_LEN 10
|
|||
|
/* Private constants ---------------------------------------------*/
|
|||
|
//<2F><><EFBFBD><EFBFBD>Timer1<72><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ID<49><44>ӦTimer<65><72>ID<49><44><EFBFBD><EFBFBD>NRF_DRV_TIMER_INSTANCE(1)<29><>ӦTimer1
|
|||
|
const nrfx_timer_t TIMER_ADC = NRF_DRV_TIMER_INSTANCE(4);
|
|||
|
static nrf_ppi_channel_t m_ppi_channel5;
|
|||
|
const nrfx_timer_t TIMER3_RMS = NRFX_TIMER_INSTANCE(3); //<2F><>ȡrmsֵ<73>Ķ<EFBFBD>ʱ<EFBFBD><CAB1>3
|
|||
|
static nrf_saadc_value_t m_buffer_pool[2][SAMPLES_BUFFER_LEN];
|
|||
|
/* Private variables ---------------------------------------------*/
|
|||
|
/* Private function prototypes -----------------------------------*/
|
|||
|
/* Public constants ----------------------------------------------*/
|
|||
|
/* Public variables ----------------------------------------------*/
|
|||
|
//<2F><><EFBFBD>ص<EFBFBD>ѹ<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
void saadc_battery_callback(nrfx_saadc_evt_t const * p_event){}
|
|||
|
//<2F>̼<EFBFBD><CCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
void saadc_stimulate_callback(nrfx_saadc_evt_t const * p_event){}
|
|||
|
/********************************************************************
|
|||
|
* name : void battery_adc_init(void)
|
|||
|
* description : ADC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>,<EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD>⡢<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD>⡢<EFBFBD>缫<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* Input : void
|
|||
|
* Output : void
|
|||
|
* Return :
|
|||
|
********************************************************************/
|
|||
|
void battery_adc_init(void)
|
|||
|
{
|
|||
|
ret_code_t err_code;
|
|||
|
|
|||
|
//<2F><>ʼ<EFBFBD><CABC>SAADC<44><43>ע<EFBFBD><D7A2><EFBFBD>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD><D5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
err_code = nrf_drv_saadc_init(NULL, saadc_battery_callback);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪAIN7<4E><37><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ
|
|||
|
nrf_saadc_channel_config_t channeltwo_config =
|
|||
|
NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN7);
|
|||
|
|
|||
|
err_code = nrfx_saadc_channel_init(SAADC_BATTERY_CHANNEL, &channeltwo_config);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
|
|||
|
// //<2F><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪAIN4<4E><34><EFBFBD>缫Ƭ<E7BCAB><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
|
|||
|
// nrf_saadc_channel_config_t channelthree_config =
|
|||
|
// NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN4);
|
|||
|
|
|||
|
// //<2F><>ʼ<EFBFBD><CABC>SAADCͨ<43><CDA8>3
|
|||
|
// err_code = nrfx_saadc_channel_init(SAADC_ELECTRODE_CHANNEL, &channelthree_config);
|
|||
|
// APP_ERROR_CHECK(err_code);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD><DFBE>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>㣨ʾ<E3A3A8><CABE><EFBFBD><EFBFBD>
|
|||
|
float nonlinear_percentage(float voltage) {
|
|||
|
// <20><>Ԫ﮵<D4AA><EFAEB5>صĵ<D8B5><C4B5>ͷŵ<CDB7><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><CFB6><EFBFBD>ʽ
|
|||
|
float p = (voltage - 3.4f) / 0.8f; // <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>[0,1]
|
|||
|
return 100 * (1.0f - 0.2f*p - 0.8f*p*p);
|
|||
|
}
|
|||
|
|
|||
|
// ﮵<><EFAEB5>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㺯<EFBFBD><E3BAAF>
|
|||
|
// <20><><EFBFBD>룺<EFBFBD><EBA3BA>ǰ<EFBFBD><C7B0>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD>
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٷֱȣ<D6B1>0~100<30><30>
|
|||
|
int calculate_battery_percentage(float voltage)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>Χ
|
|||
|
const float VOLTAGE_MIN = 3.4f; // 0%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ѹ
|
|||
|
const float VOLTAGE_MAX = 4.195f; // 100%<25><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>ѹ
|
|||
|
|
|||
|
// <20>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if (voltage <= VOLTAGE_MIN) {
|
|||
|
return 0;
|
|||
|
} else if (voltage >= VOLTAGE_MAX) {
|
|||
|
return 100;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>Բ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ٷֱȣ<D6B1><C8A3>ɸ<EFBFBD><C9B8><EFBFBD>ʵ<EFBFBD>ʷŵ<CAB7><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><DEB8>㷨<EFBFBD><E3B7A8>
|
|||
|
float percentage = (voltage - VOLTAGE_MIN) / (VOLTAGE_MAX - VOLTAGE_MIN) * 100.0f;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
|
|||
|
return (int)(percentage + 0.5f);
|
|||
|
}
|
|||
|
|
|||
|
/********************************************************************
|
|||
|
* name : void CalculateBatteryPower(void)
|
|||
|
* description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-100<EFBFBD><EFBFBD>
|
|||
|
* Input : void
|
|||
|
* Output : void
|
|||
|
* Return : void
|
|||
|
********************************************************************/
|
|||
|
|
|||
|
void CalculateBatteryPower(void)
|
|||
|
{
|
|||
|
uint16_t Adctemp;
|
|||
|
nrf_saadc_value_t Battery_Saadc_Value;
|
|||
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ADC<44><43><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Battery_Saadc_Value<75><65>
|
|||
|
nrfx_saadc_sample_convert(SAADC_BATTERY_CHANNEL, &Battery_Saadc_Value);
|
|||
|
|
|||
|
Adctemp = ((Battery_Saadc_Value * 3600) / 16384);
|
|||
|
|
|||
|
static float lastBatteryPercentage = 100;
|
|||
|
int temp = calculate_battery_percentage(Adctemp * 5.12557);
|
|||
|
|
|||
|
if(Uncharged == ChargeState) //<2F><><EFBFBD><EFBFBD>û<EFBFBD>д<EFBFBD><D0B4>ڳ<EFBFBD><DAB3><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>½<EFBFBD>
|
|||
|
{
|
|||
|
if(temp < lastBatteryPercentage)
|
|||
|
Battery_Percentage = temp;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Battery_Percentage = temp;
|
|||
|
}
|
|||
|
lastBatteryPercentage = Battery_Percentage;
|
|||
|
}
|
|||
|
|
|||
|
short short_to_big_endian(short value)
|
|||
|
{
|
|||
|
uint8_t buf[2];
|
|||
|
short resultShort;
|
|||
|
buf[0] = (value >> 8) & 0xFF; // <20><><EFBFBD>ֽڣ<D6BD>Big-Endian <20><>һ<EFBFBD><D2BB><EFBFBD>ֽڣ<D6BD>
|
|||
|
buf[1] = value & 0xFF; // <20><><EFBFBD>ֽڣ<D6BD>Big-Endian <20>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>ֽڣ<D6BD>
|
|||
|
memcpy(&resultShort,buf,2);
|
|||
|
return resultShort;
|
|||
|
}
|
|||
|
|
|||
|
/********************************************************************
|
|||
|
* name : void rms_saadc_callback(nrfx_saadc_evt_t const * p_event)
|
|||
|
* description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>SAADC<EFBFBD>¼<EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* Input : nrfx_saadc_evt_t const * p_event<EFBFBD><EFBFBD>saadc<EFBFBD>¼<EFBFBD>
|
|||
|
* Output : void
|
|||
|
* Return :
|
|||
|
********************************************************************/
|
|||
|
|
|||
|
void rms_saadc_callback(nrfx_saadc_evt_t const * p_event)
|
|||
|
{
|
|||
|
static float32_t AdcFilter_g[AD_RAW_MAX] __attribute__((aligned(4)));
|
|||
|
float32_t outFilter __attribute__((aligned(4)));
|
|||
|
float32_t vol __attribute__((aligned(4)));
|
|||
|
static emg_data_t emgData=
|
|||
|
{
|
|||
|
.emgCnt = 0
|
|||
|
};
|
|||
|
|
|||
|
if(p_event->type == NRF_DRV_SAADC_EVT_DONE)
|
|||
|
{
|
|||
|
ret_code_t err_code;
|
|||
|
err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_BUFFER_LEN);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
}
|
|||
|
|
|||
|
for(int i = 0; i < SAMPLES_BUFFER_LEN; i++)
|
|||
|
{
|
|||
|
if(p_event->data.done.p_buffer[i] < 0)
|
|||
|
vol = 0;
|
|||
|
else
|
|||
|
{
|
|||
|
vol = (p_event->data.done.p_buffer[i]*3600/16384) - 1545; //
|
|||
|
}
|
|||
|
bs_bp(&vol, &outFilter); //5.6us
|
|||
|
if(emgData.emgCnt < AD_RAW_MAX) //<2F><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
|
|||
|
AdcFilter_g[emgData.emgCnt] = outFilter;
|
|||
|
|
|||
|
emgData.emgCnt++;
|
|||
|
if(emgData.emgCnt >= AD_RAW_MAX)
|
|||
|
{
|
|||
|
emgData.emgCnt=0;
|
|||
|
float32_t temp __attribute__((aligned(4)));
|
|||
|
arm_rms_f32(AdcFilter_g, AD_RAW_MAX, &temp);//6us
|
|||
|
|
|||
|
emgData.EmgValue = temp*0.8806 - 3.028;
|
|||
|
if(emgData.EmgValue < 0)
|
|||
|
emgData.EmgValue = 0;
|
|||
|
// if(temp < 0)
|
|||
|
// emgData.EmgValue = 0;
|
|||
|
// else
|
|||
|
// emgData.EmgValue = 0.6722 * temp + 3.7097;
|
|||
|
|
|||
|
uint16_t outfRms;
|
|||
|
outfRms = (short)emgData.EmgValue;
|
|||
|
outfRms = short_to_big_endian(outfRms);
|
|||
|
ble_send_rms_data(outfRms);
|
|||
|
}
|
|||
|
|
|||
|
//ble_send_rms_data(save_value[i]);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
void timer3_rms_handler(nrf_timer_event_t event_type, void* p_context)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/********************************************************************
|
|||
|
* name : void timer3_rms_init(void)
|
|||
|
* description : <EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|||
|
* Input : void
|
|||
|
* Output : void
|
|||
|
* Return :
|
|||
|
********************************************************************/
|
|||
|
void timer3_rms_init(void)
|
|||
|
{
|
|||
|
uint32_t err_code = NRF_SUCCESS;
|
|||
|
uint32_t time_us = 500; //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>2kHz
|
|||
|
uint32_t time_ticks;
|
|||
|
nrfx_timer_config_t timer3_cfg = NRFX_TIMER_DEFAULT_CONFIG;
|
|||
|
err_code = nrfx_timer_init(&TIMER3_RMS, &timer3_cfg, timer3_rms_handler);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
time_ticks = nrfx_timer_us_to_ticks(&TIMER3_RMS, time_us);
|
|||
|
nrfx_timer_extended_compare(
|
|||
|
&TIMER3_RMS, NRF_TIMER_CC_CHANNEL0, time_ticks, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true);
|
|||
|
}
|
|||
|
/********************************************************************
|
|||
|
* name : void timer3_rms_start(void)
|
|||
|
* description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>1
|
|||
|
* Input : void
|
|||
|
* Output : void
|
|||
|
* Return :
|
|||
|
********************************************************************/
|
|||
|
void timer3_rms_start(void)
|
|||
|
{
|
|||
|
nrfx_timer_enable(&TIMER3_RMS);
|
|||
|
}
|
|||
|
/********************************************************************
|
|||
|
* name : void timer3_rms_stop(void)
|
|||
|
* description : ֹͣ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>1
|
|||
|
* Input : void
|
|||
|
* Output : void
|
|||
|
* Return :
|
|||
|
********************************************************************/
|
|||
|
void timer3_rms_stop(void)
|
|||
|
{
|
|||
|
nrfx_timer_disable(&TIMER3_RMS);
|
|||
|
}
|
|||
|
|
|||
|
/********************************************************************
|
|||
|
* name : void PPIEegAdcInit(void)
|
|||
|
* description : ADCPPIͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|||
|
* Input : void
|
|||
|
* Output : void
|
|||
|
* Return :
|
|||
|
********************************************************************/
|
|||
|
void PPIEegAdcInit(void)
|
|||
|
{
|
|||
|
uint32_t err_code = NRF_SUCCESS;
|
|||
|
|
|||
|
err_code = nrf_drv_ppi_init();
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>PPIͨ<49><CDA8><EFBFBD><EFBFBD>PPIͨ<49><CDA8><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵģ<C9B5><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ű<EFBFBD><C5B1>浽my_ppi_channel1<6C><31>
|
|||
|
err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel5);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
//<2F><><EFBFBD><EFBFBD>PPIͨ<49><CDA8><EFBFBD><EFBFBD>EEP<45><50>TEP
|
|||
|
err_code = nrf_drv_ppi_channel_assign(m_ppi_channel5,
|
|||
|
nrf_drv_timer_event_address_get(&TIMER3_RMS, NRF_TIMER_EVENT_COMPARE0),
|
|||
|
nrf_drv_saadc_sample_task_get());
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
//ʹ<><CAB9>PPIͨ<49><CDA8>
|
|||
|
err_code = nrf_drv_ppi_channel_enable(m_ppi_channel5);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
}
|
|||
|
|
|||
|
/********************************************************************
|
|||
|
* name : void rms_saadc_init(void)
|
|||
|
* description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>saadc<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|||
|
* Input : void
|
|||
|
* Output : void
|
|||
|
* Return :
|
|||
|
********************************************************************/
|
|||
|
void rms_saadc_init(void)
|
|||
|
{
|
|||
|
ret_code_t err_code;
|
|||
|
nrf_drv_saadc_uninit(); //<2F>ȷ<EFBFBD><C8B7><EFBFBD>ʼ<EFBFBD><CABC>
|
|||
|
//<2F><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪAIN3<4E><33><EFBFBD>ɼ<EFBFBD><C9BC>ź<EFBFBD>
|
|||
|
nrf_saadc_channel_config_t channel_config =
|
|||
|
NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
|
|||
|
//<2F><>ʼ<EFBFBD><CABC>SAADC<44><43>ע<EFBFBD><D7A2><EFBFBD>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
err_code = nrf_drv_saadc_init(NULL, rms_saadc_callback);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
//<2F><>ʼ<EFBFBD><CABC>SAADCͨ<43><CDA8>0
|
|||
|
err_code = nrfx_saadc_channel_init(SAADC_RMS_SAMPLE_CHANNEL, &channel_config);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
//<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ַ<EFBFBD><D6B7>ֵ<EFBFBD><D6B5>SAADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĿ<D0B5><C4BF>ƿ<EFBFBD>m_cb<63><62>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
err_code = nrfx_saadc_buffer_convert(m_buffer_pool[0], SAMPLES_BUFFER_LEN);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
//<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ַ<EFBFBD><D6B7>ֵ<EFBFBD><D6B5>SAADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĿ<D0B5><C4BF>ƿ<EFBFBD>m_cb<63>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
err_code = nrfx_saadc_buffer_convert(m_buffer_pool[1], SAMPLES_BUFFER_LEN);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
// <20>缫<EFBFBD><E7BCAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
void ElectFallOff(void)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
/********************************************************************
|
|||
|
* name : void timer4_output_ctrl_handler(nrf_timer_event_t event_type, void* p_context)
|
|||
|
* description : <EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD><EFBFBD>ơ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⡢<EFBFBD>̼<EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
* Input : nrf_timer_event_t event_type<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
void* p_context
|
|||
|
* Output : void
|
|||
|
* Return :
|
|||
|
********************************************************************/
|
|||
|
void timer1_output_ctrl_handler(nrf_timer_event_t event_type, void* p_context)
|
|||
|
{
|
|||
|
switch(event_type)
|
|||
|
{
|
|||
|
case NRF_TIMER_EVENT_COMPARE0:
|
|||
|
//ElectFallOff();
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
/********************************************************************
|
|||
|
* name : void timer1_output_ctrl_init(void)
|
|||
|
* description : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
|
|||
|
* Input : void
|
|||
|
* Output : void
|
|||
|
* Return :
|
|||
|
********************************************************************/
|
|||
|
void timer1_output_ctrl_init(void)
|
|||
|
{
|
|||
|
ret_code_t err_code = NRF_SUCCESS;
|
|||
|
uint32_t time_us = 50;
|
|||
|
uint32_t time_ticks;
|
|||
|
|
|||
|
nrfx_timer_config_t timer_cfg = NRFX_TIMER_DEFAULT_CONFIG;
|
|||
|
|
|||
|
err_code = nrfx_timer_init(&TIMER_ADC, &timer_cfg, timer1_output_ctrl_handler);
|
|||
|
APP_ERROR_CHECK(err_code);
|
|||
|
|
|||
|
//<2F><>ʱʱ<CAB1><CAB1>(<28><>λus)ת<><D7AA>Ϊticks
|
|||
|
time_ticks = nrfx_timer_us_to_ticks(&TIMER_ADC, time_us);
|
|||
|
//<2F><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F>Ƚ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ıȽ<C4B1>ֵ<EFBFBD><D6B5>ʹ<EFBFBD><CAB9>ͨ<EFBFBD><CDA8><EFBFBD>ıȽ<C4B1><C8BD>ж<EFBFBD>
|
|||
|
nrfx_timer_extended_compare(
|
|||
|
&TIMER_ADC, NRF_TIMER_CC_CHANNEL0, time_ticks, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true);
|
|||
|
nrfx_timer_enable(&TIMER_ADC);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*************************** END OF FILE ***************************/
|