STM32 DAC detallado

Tabla de contenido

01. Introducción a DAC

02, conversión DAC

03. Descripción de la función

04, voltaje de salida DAC

05, configuración de código


El artículo anterior presentó la " Explicación detallada de STM32ADC " Dado que hay un módulo ADC de analógico a digital, debe haber un módulo DAC de digital a analógico. Como sugiere el nombre, este módulo solo tiene las funciones complementarias de ADC. Convierte valores binarios digitales en salida de voltaje analógico. El módulo DAC tiene muchos usos, incluida la generación de audio, la generación de formas de onda, etc. Por lo general, en la mayoría de los microcontroladores de 8 bits, este módulo no está disponible y la modulación de ancho de pulso (PWM) puede satisfacer ligeramente sus necesidades. Parte de la razón se debe a sus relativamente bajos recursos de hardware y velocidad operativa. Todos los microcontroladores STM32 tienen un módulo PWM, pero el STM32 de alta capacidad también tiene un módulo DAC. El módulo STM32DAC no es muy complicado y es similar al módulo ADC en términos de principio de funcionamiento.

01. Introducción a DAC

Visto desde la hoja de datos STM32F207, STM32F207 tiene dos módulos DAC.

Cada DAC tiene un canal independiente, y los GPIO correspondientes son: PA4 y PA5. Para las funciones alternativas de GPIO (funciones alternativas) y funciones adicionales (funciones adicionales), hay una explicación detallada en " Explicación detallada de STM32ADC ".

Además de los pines de salida DAC, hay otros pines relacionados

Nota: Después de habilitar el canal DAC x, el pin GPIO correspondiente (PA4 o PA5) se conectará automáticamente a la salida del convertidor analógico (DAC_OUTx). Para evitar un consumo de corriente parásito, primero configure el pin PA4 o PA5 en modo analógico (AIN).

El siguiente diagrama de bloques simplificado muestra los componentes principales del módulo STM32DAC.

02, conversión DAC

Puede verse en el diagrama de bloques que el DAC está controlado directamente por el registro DORx, pero los datos no se pueden escribir directamente en el registro DORx, sino que se pasan indirectamente al registro DORx a través de DHRx para realizar el control de salida del DAC.

No puede escribir datos directamente en el registro DAC_DORx. Cualquier salida de datos al canal DAC x debe escribirse en el registro DAC_DHRx (los datos en realidad se escriben en el registro DAC_DHR8Rx, DAC_DHR12Lx, DAC_DHR12Rx, DAC_DHR8RD, DAC_DHR12LD) o DRDHR12).

  1. Si no se selecciona el disparador de hardware (el bit TENx del registro DAC_CR1 es 0), los datos almacenados en el registro DAC_DHRx se transferirán automáticamente al registro DAC_DORx después de un ciclo de reloj APB1;

  2. Si se selecciona el disparador de hardware (el bit TENx del registro DAC_CR1 se establece en 1), la transferencia de datos se completa 3 ciclos de reloj APB1 después de que ocurre el disparo.

Una vez que los datos se cargan desde el registro DAC_DHRx al registro DAC_DORx, la salida es válida una vez transcurrido el tiempo tSETTLING. La duración de este período de tiempo variará según el voltaje de la fuente de alimentación y la carga de la salida analógica.

Registro de control DAC (DAC_CR)

     DMAEN1: habilitación de DMA del canal 1 de DAC (habilitación de DMA del canal 1 de DAC), no usamos DMA, por lo tanto, establézcalo en 0

     MAMP1 [3: 0]: el selector de amplitud / máscara del canal 1 del DAC (selector de amplitud / máscara del canal 1 del DAC) no se utiliza, por lo que estos bits también se establecen en 0

     WAVE1 [1: 0]: Habilitación de generación de ruido / onda triangular del canal DAC 1 (ruido del canal 1 DAC / generación de onda triangular habilitada), también lo usamos y lo configuramos en 0

     TEN1: Habilitación de disparo del canal 1 del DAC (habilitación del disparo del canal 1 del DAC) No necesitamos disparar, así que configúrelo en 0

     TSEL1 [2: 0]: selección de disparo del canal 1 del DAC (selección del disparo del canal 1 del DAC) Nota: Este bit solo se puede establecer cuando TEN1 = 1 (selección del disparo del canal 1 del DAC). Establecemos TEN1 en 0, por lo que estos bits no necesitan establecerse, el valor predeterminado es 0

     BOFF1: Desactiva el búfer de salida del canal 1 del DAC (desactiva el búfer de salida del canal 1 del DAC) Apagamos el búfer de salida para que se establezca en 1.

     EN1: DAC channel1 enable (DAC channel1 enable) Queremos habilitar el canal DAC, así que configúrelo en 1.

03. Descripción de la función

El circuito equivalente DAC de STM32 es el siguiente

El búfer de salida que se muestra en este circuito funciona con una fuente de alimentación interna de 3.3V. Como la mayoría de las operaciones que operan con una sola fuente de alimentación (en lugar de +/- fuentes de alimentación dobles), la oscilación de salida nunca alcanzará realmente el objetivo. Sin embargo, como se muestra en el circuito, hay dos interruptores internos (S1 y S2) que se pueden controlar mediante registros. Encenderlos conectará directamente la señal "DACINT" al pin "DACOUT" a través de dos resistencias conectadas en serie (Ra y Rb). Como referencia, Ra + Rb es de aproximadamente 15k.

 

Según el modo de configuración seleccionado, los datos se escriben en el registro especificado como se describe a continuación:

Un solo canal DAC x, hay 3 casos:

  1. Datos de 8 bits justificados a la derecha: el usuario debe escribir los datos en el registro DAC_DHR8Rx [7: 0] bits (en realidad, se almacena en el registro DHRx [11: 4] bits);

  2. Datos de 12 bits justificados a la izquierda: el usuario debe escribir los datos en el registro DAC_DHR12Lx [15: 4] bits (en realidad, se almacena en el registro DHRx [11: 0] bits);

  3. Los datos de 12 bits están justificados a la derecha: el usuario debe escribir los datos en el registro DAC_DHR12Rx [11: 0] bits (en realidad, se almacena en el registro DHRx [11: 0] bits).

Generalmente, se adopta el tercer método: los datos de 12 bits están más alineados a la derecha.

Según la operación en el registro DAC_DHRyyyx, después del desplazamiento correspondiente, los datos escritos se transfieren al registro DHRx (DHRx es el registro de almacenamiento interno de datos x). Posteriormente, el contenido del registro DHRx se transfiere automáticamente al registro DORx o se transfiere al registro DORx mediante un disparador de software o un disparador de evento externo.

Para canales DAC duales, hay 3 situaciones:

  1. Datos de 8 bits alineados a la derecha: el usuario debe escribir los datos del canal DAC 1 en el registro DAC_DHR8RD [7: 0] bits (en realidad, en el registro DHR1 [11: 4] bits) y escribir los datos del canal DAC 2 en el registrar DAC_DHR8RD [15: 8] bit (en realidad almacenado en el registro DHR2 [11: 4] bit);

  2. Datos de 12 bits alineados a la izquierda: el usuario debe escribir los datos del canal DAC 1 en el registro DAC_DHR12LD [15: 4] bits (en realidad, en el registro DHR1 [11: 0] bits) y escribir los datos del canal DAC 2 en el registro DAC_DHR12LD [31: 20] bit (en realidad almacenado en el registro DHR2 [11: 0] bit);

  3. Datos de 12 bits alineados a la derecha: el usuario debe escribir los datos del canal 1 del DAC en los bits del registro DAC_DHR12RD [11: 0] (en realidad, en los bits del registro DHR1 [11: 0]) y escribir los datos del canal 2 del DAC en el registrar DAC_DHR12RD [27: 16] bits (en realidad almacenados en el registro DHR2 [11: 0] bits).

04, voltaje de salida DAC

Cuando el voltaje de referencia del DAC es VREF +, la entrada digital se convierte linealmente en una salida de voltaje analógico a través del DAC, y su rango es de 0 a VREF +.

El voltaje de salida en cualquier pin del canal DAC satisface la siguiente relación:

Salida DAC = VREF x (DOR / 4095).

Nota: En este momento, el formato de datos: los datos de 12 bits deben estar justificados a la derecha.

05, configuración de código

Configuración DAC

void DAC1_Config(void)
{
  DAC_InitTypeDef  DAC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  
  /* DMA1 clock and GPIOA clock enable (to be used with DAC) */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  
  /* DAC Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  
  /* DAC channel 1 & 2 (DAC_OUT1 = PA.4)(DAC_OUT2 = PA.5) configuration */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
   /* DAC channel2 Configuration */
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);

  /* Enable DAC Channel2 */
  DAC_Cmd(DAC_Channel_1, ENABLE);
}

Establecer voltaje de salida

 

//设置通道1输出电压
//vol:0~3300,代表0~3.3V
void Dac1_Set_Vol(uint16_t vol)
{
  double temp=vol;
  temp/=1000;
  temp=temp*4096/3.3;
  DAC_SetChannel1Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值
}

El caso de prueba es muy simple, es para generar repetidamente voltaje de 1.2V y 3.0V

 

 while (1)
  {
    GPIO_SetBits(GPIOE,GPIO_Pin_4);  //熄灭LED灯
    Dac1_Set_Vol(1200);
    LCD_ShowString(0,0,"DAC OUT 1.2V");
    Delay(500);                      //延时500ms
    GPIO_ResetBits(GPIOE,GPIO_Pin_4);//点亮LED灯
    Dac1_Set_Vol(3000);
    LCD_ShowString(0,0,"DAC OUT 3.0V");
    Delay(500);                      //延时500ms
  }

Descarga de verificación

 

 

 

Dirección de código abierto de hardware y software:

https://github.com/strongercjd/STM32F207VCT6

 

Haga clic para ver el álbum donde se encuentra este artículo, tutorial STM32F207

 

Preste atención a la cuenta oficial y reciba actualizaciones de artículos lo antes posible . El área de comentarios no se puede ver a tiempo, puedes ir a la cuenta oficial para comunicarte si necesitas comunicarte

Supongo que te gusta

Origin blog.csdn.net/Firefly_cjd/article/details/108789076
Recomendado
Clasificación