回复
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
回复
相关推荐