De lo analógico a lo digital, un artículo para comprender el ADC de conducción de OneOS

De lo analógico a lo digital, un artículo para comprender el ADC de conducción de OneOS

  1. equipo ADC

1.1 Introducción

El dispositivo ADC es un dispositivo que convierte analógico a digital, es decir, convertidor analógico a digital, convertidor analógico/digital. En consecuencia, también hay un dispositivo DAC, a saber, convertidor de digital a analógico, un convertidor digital/analógico, que se utiliza para convertir cantidades digitales en cantidades analógicas.

1.2 Análisis de parámetros ADC

  1. resolución ADC

Se refiere al número máximo que puede representar el convertidor de analógico a digital, es decir, el número de dígitos del ADC.Si el ADC es un ADC de 10 bits, entonces la resolución es de 2 a la décima potencia, es decir , la resolución de 1024. Si la cantidad analógica es la temperatura, el rango de medición es de 0 ~ 100 grados, entonces puede dividir 100 grados en 1024 partes, puede sentir cada parte y puede medirla cuando la temperatura cambia en 100/ 1024 grados.

  1. Tasa de muestreo ADC

Se refiere a cuántas veces el ADC convierte operaciones analógicas a digitales por segundo. Por ejemplo, 10K/s significa que el ADC recopila 10K valores analógicos por segundo y convierte los valores analógicos en valores digitales.

  1. pasillo

Es decir, el pin de entrada ADC. Por lo general, un controlador ADC controla múltiples canales. Si se requieren múltiples canales, se debe realizar un escaneo de canales.

  1. método de conversión ADC 

Conversión única: solo convierta un canal a la vez;

Conversión continua: ejecute automáticamente la conversión del siguiente canal inmediatamente después de que se complete la conversión de un canal;

Modo de escaneo: después de encenderse una vez, leerá automáticamente varios canales de forma continua.

  1. Tres modos de trabajo de ADC 

Modo de bloqueo (modo de consulta), modo de interrupción, modo DMA

  1. Acceso y registro de dispositivos ADC

2.1 Acceso al dispositivo ADC

Cuando el usuario acceda al dispositivo ADC, llamará a la interfaz de la capa de administración de dispositivos, como os_device_find(), os_device_open(), os_device_control(), os_device_read_nonblock(), os_device_close(), etc., para realizar el acceso a la ADC. La interfaz de la capa de administración de dispositivos llama a la interfaz de la capa del marco del dispositivo y luego llama a la interfaz de la capa del controlador del dispositivo y finalmente realiza las operaciones relacionadas en el hardware ADC.

Tome la función " os_device_control() " como ejemplo.

 

función

camino

Capa

ejecución de arriba hacia abajo

os_device_control()

controladores\dispositivo.c

Gestión de dispositivos

(Interfaz funcional común a todos los dispositivos)

_adc_control()

drivers\misc\adc.c

Capa de marco de dispositivo

(abstracción de dispositivos similares)

stm32_adc_habilitado()

drivers\hal\st\drivers\drv_adc.c

capa de controlador de dispositivo

(Acceso a hardware específico por interfaz de función)

2.2 Registro del dispositivo ADC

En el proceso de acceder al dispositivo ADC, desde la capa de administración de dispositivos hasta la capa de controladores de dispositivos, ¿cómo determina el sistema a qué interfaz llamar? Esto es lo que se especificó cuando se registró el dispositivo ADC. El proceso de registro de dispositivos es justo lo opuesto al proceso de acceso a dispositivos. Al registrarse, comienza desde la capa de controlador de dispositivos hasta la capa de administración de dispositivos, como se muestra en la tabla a continuación.

 

función

camino

Capa

ejecución de arriba hacia abajo

stm32_adc_probe()

drivers\hal\st\drivers\drv_adc.c

capa de controlador de dispositivo

os_hw_adc_register()

drivers\misc\adc.c

Capa de marco de dispositivo

os_device_register()

controladores\dispositivo.c

Gestión de dispositivos

(Agregue el nodo del dispositivo a la lista de dispositivos)

 

A continuación, se dará una breve descripción del proceso de registro.

2.2.1 Capa de controlador de dispositivo

Ubicación: drivers\hal\st\drivers\drv_adc.c

A partir de la función " stm32_adc_probe() ", la siguiente es una captura de pantalla parcial.

  1. La siguiente declaración en esta función determina la función de interfaz a la que se llama al acceder al dispositivo:

  1. En esta función, la siguiente declaración llama a la función os_hw_adc_register() de la capa del marco del dispositivo:

  1. Las dos estructuras implicadas en esta función

Ubicación: conductores\bus\bus.h

2.2.2 Capa del marco del dispositivo

Ubicación: drivers\misc\adc.c

La siguiente función os_hw_adc_register() es llamada por la capa de controlador de dispositivo mencionada anteriormente .

En esta función, continúe llamando a la interfaz os_device_register() de la capa de administración de dispositivos.

2.2.3 Capa de gestión de dispositivos

Ubicación: controladores\dispositivo.c

La siguiente función os_device_register() es llamada por la capa del marco del dispositivo mencionada anteriormente . La siguiente imagen es una captura de pantalla parcial.

  1. La siguiente declaración en esta función realiza la adición del nodo del dispositivo a la lista de dispositivos del sistema:

Las definiciones relevantes son:

①Controladores de ubicación\dispositivo.c

②Ubicación kernel\ incluye \os_list.h

Definición de la función os_list_add:

Ubicación: kernel\include\os_list.h

④Definición de nodos de lista enlazada:

Ubicación: kernel\include\os_list.h

  1. Proceso de ejecución de demostración de ADC

ubicación del archivo de demostración: demos\driver\adc_test.c

de arriba a abajo

 

Depender de

Ejecutar de izquierda a derecha

os_device_find()

(dispositivo.c)

os_device_open()

(dispositivo.c)

os_device_control()

(dispositivo.c)

_adc_control()

(adc.c)

stm32_adc_habilitado()

(drv_adc.c)

os_device_read_nonblock()

(dispositivo.c)

_adc_read()

(adc.c)

os_adc_read()

(adc.c)

stm32_adc_read()

(drv_adc.c)

os_device_control()

(dispositivo.c)

_adc_control()

(adc.c)

stm32_adc_habilitado()

(drv_adc.c)

os_device_close()

(dispositivo.c)

 

camino

controladores\dispositivo.c

drivers\misc\adc.c

drivers\hal\st\drivers\drv_adc.c

La función adc_sample() ejecuta parcialmente el análisis del proceso:

adc_test.c【int adc_sample(int argc, char **argv)】

Función (ejecutada de arriba a abajo)

Declaración (ejecutada de arriba a abajo)

Función

os_device_find(argv[1])

Función: busque el dispositivo por el nombre del dispositivo " argv[1] "

Ubicación: OneOS\drivers\device.c

os_sem_wait(&dev_sem , OS_WAIT_FOREVER);

espera de semáforo

en bucle

Encuentre el dispositivo en la lista vinculada "os_device_list"

os_sem_post(&dev_sem);

desarrollo de retorno;

找到则释放信号量并返回对应设备结构体(类型“os_device_t”)

os_sem_post(&dev_sem);

return OS_NULL;

未找到设备则释放信号量并返回“OS_NULL”

os_device_open(adc_dev);

条件:找到设备后可执行

功能:“打开”设备,可初始化设备

位置:OneOS\drivers\device.c

os_sem_wait(&dev->sem, OS_WAIT_FOREVER);

信号量等待

dev->ops->init(dev);

初始化设备,但本测试中未进行。

涉及结构体:“os_device”“os_device_ops”

os_sem_post(&dev->sem);

释放信号量

os_plug_get("device", dev->name);

return result;

plug->ref_count++;

返回“OS_EOK”

os_device_control(adc_dev, OS_ADC_CMD_ENABLE, OS_NULL);

位置:OneOS\drivers\device.c

 

switch语句

由输入的cmd:OS_ADC_CMD_ENABLE在switch语句中进行匹配,未匹配到对应指令

os_sem_wait(&dev->sem, OS_WAIT_FOREVER);

信号量等待

dev->ops->control(dev, cmd, arg);

进入“_adc_control()

os_sem_post(&dev->sem);

return ret;

释放信号量;

返回“_adc_control()的返回结果

_adc_control(struct os_device *dev, int cmd, void *args)

os_device_control()函数进入

位置:OneOS\drivers\misc\adc.c

switch语句

由输入的cmd:OS_ADC_CMD_ENABLE在switch语句中进行匹配

adc->ops->adc_enabled(adc, OS_TRUE);

return result;

执行stm32_adc_enabled()然后返回其执行结果

stm32_adc_enabled()

_adc_control()函数进入

位置:OneOS\drivers\hal\st\drivers\drv_adc.c

/

使能设备,返回OS_EOK

os_device_read_nonblock(adc_dev, adc_channel, &adc_databuf, sizeof(adc_databuf));

位置:OneOS\drivers\device.c

dev->ops->read(dev, pos, buffer, size);

进入“_adc_read()”函数

涉及结构体:

 

 return count;

返回“_adc_read()”执行结果

_adc_read(struct os_device *dev, os_off_t pos, void *buffer, os_size_t size)

for循环

 

 

return i;

返回执行os_adc_read()的次数

 

人大毕业生盗取全校学生信息建颜值打分网站,已被刑拘 基于 NT 架构的全新 QQ Windows 版正式发布 美国将限制中国使用亚马逊、微软等提供训练 AI 模型的云服务 资金严重短缺,又一流行开源项目宣布停止功能开发 2023 年收入最高的技术岗位 LeaferJS 发布:开源、性能强悍的 2D 图形库 Visual Studio Code 1.80 发布,支持终端图片功能 Threads 注册量已破三千万,后端基于 CPython 深度“魔改” deepin 采用 Asahi Linux 适配 Apple M1 7 月数据库排行:Oracle 大涨,再度拉开比分
{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/u/5443273/blog/10086865
Recomendado
Clasificación