Hello
I'm going to use a potentiometer to control the pwm.
I am using a 10K potentiometer and have used a saadc example.
I printed out the value of adc through this example, but the value seems to be printing out weirdly.
This is the result of slowly turning the dial of the potentiometer in the opposite direction to the end. The value changes only when I turn the dial almost to the end after the value is almost constant.
<info> app: ADC value : 12 <info> app: ADC value : 10 <info> app: ADC value : 10 <info> app: ADC value : 9 <info> app: ADC value : 12 <info> app: ADC value : 12 <info> app: ADC value : 13 <info> app: ADC value : 12 <info> app: ADC value : 8 <info> app: ADC value : 9 <info> app: ADC value : 11 <info> app: ADC value : 12 <info> app: ADC value : 13 <info> app: ADC value : 13 <info> app: ADC value : 12 <info> app: ADC value : 11 <info> app: ADC value : 9 <info> app: ADC value : 9 <info> app: ADC value : 11 <info> app: ADC value : 11 <info> app: ADC value : 13 <info> app: ADC value : 12 <info> app: ADC value : 12 <info> app: ADC value : 11 <info> app: ADC value : 10 <info> app: ADC value : 10 <info> app: ADC value : 10 <info> app: ADC value : 12 <info> app: ADC value : 13 <info> app: ADC value : 12 <info> app: ADC value : 14 <info> app: ADC value : 21 <info> app: ADC value : 417 <info> app: ADC value : 521 <info> app: ADC value : 522 <info> app: ADC value : 519 <info> app: ADC value : 513 <info> app: ADC value : 497 <info> app: ADC value : 503 <info> app: ADC value : 503 <info> app: ADC value : 504
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "nrf.h"
#include "nrf_drv_saadc.h"
#include "nrf_drv_ppi.h"
#include "nrf_drv_timer.h"
#include "boards.h"
#include "app_error.h"
#include "nrf_delay.h"
#include "app_util_platform.h"
#include "nrf_pwr_mgmt.h"
#include "app_pwm.h" //add
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
APP_PWM_INSTANCE(PWM1,1);
#define SAMPLES_IN_BUFFER 5
volatile uint8_t state = 1;
static volatile bool ready_flag; // A flag indicating PWM status.
static const nrf_drv_timer_t m_timer = NRF_DRV_TIMER_INSTANCE(0);
static nrf_saadc_value_t m_buffer_pool[2][SAMPLES_IN_BUFFER];
static nrf_ppi_channel_t m_ppi_channel;
static uint32_t m_adc_evt_counter;
void pwm_ready_callback(uint32_t pwm_id) // PWM callback function
{
ready_flag = true;
}
void timer_handler(nrf_timer_event_t event_type, void * p_context)
{
}
#define ADC_TIME 100
void saadc_sampling_event_init(void)
{
ret_code_t err_code;
err_code = nrf_drv_ppi_init();
APP_ERROR_CHECK(err_code);
nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;
timer_cfg.bit_width = NRF_TIMER_BIT_WIDTH_32;
err_code = nrf_drv_timer_init(&m_timer, &timer_cfg, timer_handler);
APP_ERROR_CHECK(err_code);
/* setup m_timer for compare event every 400ms */
uint32_t ticks = nrf_drv_timer_ms_to_ticks(&m_timer, ADC_TIME);
nrf_drv_timer_extended_compare(&m_timer,
NRF_TIMER_CC_CHANNEL0,
ticks,
NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
false);
nrf_drv_timer_enable(&m_timer);
uint32_t timer_compare_event_addr = nrf_drv_timer_compare_event_address_get(&m_timer,
NRF_TIMER_CC_CHANNEL0);
uint32_t saadc_sample_task_addr = nrf_drv_saadc_sample_task_get();
/* setup ppi channel so that timer compare event is triggering sample task in SAADC */
err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_assign(m_ppi_channel,
timer_compare_event_addr,
saadc_sample_task_addr);
APP_ERROR_CHECK(err_code);
}
void saadc_sampling_event_enable(void)
{
ret_code_t err_code = nrf_drv_ppi_channel_enable(m_ppi_channel);
APP_ERROR_CHECK(err_code);
}
void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
int16_t adc_value = 0; //0 ~ 550
//int16_t pwm_value = 0; //35 ~ 55kHz
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_IN_BUFFER);
APP_ERROR_CHECK(err_code);
int i;
//NRF_LOG_INFO("ADC event number: %d", (int)m_adc_evt_counter);
for (i = 0; i < SAMPLES_IN_BUFFER; i++)//output 5times
{
//NRF_LOG_INFO("%d", p_event->data.done.p_buffer[i]);
adc_value += p_event->data.done.p_buffer[i]; //adc adverage
}
m_adc_evt_counter++;
adc_value /= SAMPLES_IN_BUFFER; //abc adverage
NRF_LOG_INFO("ADC value : %d", (int)adc_value);
}
}
void saadc_init(void)
{
ret_code_t err_code;
nrf_saadc_channel_config_t channel_config =
NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);
err_code = nrf_drv_saadc_init(NULL, saadc_callback);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_channel_init(0, &channel_config);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[0], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[1], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);
}
/**
* @brief Function for main application entry.
*/
int main(void)
{
uint32_t err_code = NRF_LOG_INIT(NULL);
APP_ERROR_CHECK(err_code);
NRF_LOG_DEFAULT_BACKENDS_INIT();
ret_code_t ret_code = nrf_pwr_mgmt_init();
APP_ERROR_CHECK(ret_code);
saadc_init();
saadc_sampling_event_init();
saadc_sampling_event_enable();
//PWM
/*app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(pwm_value, 23);
pwm1_cfg.pin_polarity[1] = APP_PWM_POLARITY_ACTIVE_HIGH;
err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
APP_ERROR_CHECK(err_code); */
app_pwm_enable(&PWM1);
while (1)
{
nrf_pwr_mgmt_run();
//ready_flag = false;
//APP_ERROR_CHECK(app_pwm_channel_duty_set(&PWM1, 0, 50)); //1-channel
NRF_LOG_FLUSH();
}
}
/** @} */
Reading the value as analogRead() in Arduino, I can see that the value changes consistently when I dial.
How can I read the value of adc exactly like this?
Thank you.