This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

The adc value of the potentiometer seems to be strange.

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.

Parents Reply Children
Related