Hi3861的micropython移植之ADC 原创

再见南丫岛
发布于 2022-5-14 11:41
浏览
1收藏

本文介绍Micropython中的ADC接口使用。

1、打开ADC编译

#define MICROPYTHON_USING_MACHINE_ADC   (1)
#define  MICROPY_PY_MACHINE_ADC (1)

在modmachine.c文件中的machine_module_globals_table数据中会包含
#if MICROPY_PY_MACHINE_ADC
{ MP_ROM_QSTR(MP_QSTR_ADC), MP_ROM_PTR(&machine_adc_type) },
#endif

2、移植ADC的接口函数

Hi3861的ADC的使用比较简单,只需要初始化和读取。
定义设备编号

STATIC machine_adc_obj_t machine_adc_obj[] = {
    {{&machine_adc_type},1,0,1},
};

初始化函数:

STATIC mp_obj_t machine_adc_make_new(const mp_obj_type_t *type,size_t n_args, size_t n_kw, const mp_obj_t *args) {
    
    int wanted_channel = mp_obj_get_int(args[0]);
    // create ADC object from the given pin
    machine_adc_obj_t *self = NULL;

    for(int i=0;i< MP_ARRAY_SIZE(machine_adc_obj);i++)
    {
        if(wanted_channel == machine_adc_obj[i].channel)
        {
            self = (machine_adc_obj_t *)&machine_adc_obj[i];
        }
    }
    if (self == NULL || self->base.type == NULL) {
        mp_raise_ValueError(MP_ERROR_TEXT("invalid ADC channel"));
    }

    mp_arg_check_num(n_args, n_kw, 1, 2, true);

    if(self->ble_ex == 1)
    {
        set_adc_attribute(self->channel,0);
    }
    else if(self->ble_ex == 2)
    {
        exb_set_io_attribute(self->channel,0x02);
    }
    self->is_init = 1;
    return MP_OBJ_FROM_PTR(self);
}

ADC读取函数:

STATIC mp_obj_t machine_adc_read(mp_obj_t self_in) {
    machine_adc_obj_t *self = MP_OBJ_TO_PTR(self_in);
    int tval = 0;
    error_check(self->is_init == 1, "ADC device uninitialized");
    if(self->ble_ex == 0)
    {
        hi_adc_read(self->channel, &tval, HI_ADC_EQU_MODEL_1, HI_ADC_CUR_BAIS_DEFAULT, 0xFF);
        //printf("adc = %d\r\n",tval);
    }
    else if(self->ble_ex == 1)
    {
        get_adc_value(self->channel, &tval);
    }
    else
    {
       tval = exb_get_adc(self->channel);
    }
    return MP_OBJ_NEW_SMALL_INT(tval);
}

3、Python编程使用ADC

from machine import ADC     # Import the ADC class from machine
import time
#adc = ADC(12) #button
adc = ADC(6) #旋转电阻
while True:
    value = adc.read()
    print(value)
    time.sleep(1)

4、总结

ADC的使用比较简单,移植的过程也很容易。今天的文章,就先总结到这里。后续会整理比如网络连接、SOCKET、OLED驱动、文件系统等等的移植说明。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
2
收藏 1
回复
举报
回复
    相关推荐