De lo analógico a lo digital, un artículo para comprender el ADC de conducción de OneOS
-
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
- 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.
- 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.
- 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.
- 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.
- Tres modos de trabajo de ADC
Modo de bloqueo (modo de consulta), modo de interrupción, modo DMA
- 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.
- La siguiente declaración en esta función determina la función de interfaz a la que se llama al acceder al dispositivo:
- En esta función, la siguiente declaración llama a la función os_hw_adc_register() de la capa del marco del dispositivo:
- 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.
- 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
- 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 大涨,再度拉开比分