Cómo utilizar la conversión AD multicanal del microcontrolador STM8S
Te daré una rutina. Tengo dos canales. Uno es para recolectar audio, y luego las luces de colores parpadearán con el ritmo de la música y la energía de la batería se recolectará al mismo tiempo. .
void AD2_Config(void)
{
/* Iniciar GPIO para ADC2 */
GPIO_Init(GPIOB, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT) ;
/* De-Init ADC periférico*/
ADC1_DeInit();
ADC1_ClearITPendingBit(ADC1_IT_EOC);
/* Init Periférico ADC1 */
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_6, ADC1_PRESSEL_FCPU_D18, \
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL6,\
DISABLE);
/* Habilitar interrupción EOC */
//if(autoFm == 1)
ADC1_ITConfig(ADC1_IT_EOCIE, DISABLE
//else);
// ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);
/* Habilitar interrupciones generales */
/*Iniciar conversión */
ADC1_StartConversion();
}
void AD_Config(void)
{
/* Iniciar GPIO para ADC2 */
GPIO_Init(GPIOB, GPIO_PIN_7, GPIO_MODE_IN_FL_NO_IT);
// GPIOD-gt; ODR amp; = 0x8f
/* De-Init ADC periférico*/ p>
ADC1_DeInit();
ADC1_ClearITPendingBit(ADC1_IT_EOC);
/* Iniciar periférico ADC1 */
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS, ADC1_CHANNEL_7, ADC1_PRESSEL_FCPU_D18, \
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_CHANNEL7, \
DISABLE);
/* Habilitar interrupción EOC */
// if(autoFm == 1)
// ADC1_ITConfig(ADC1_IT_EOCIE, DISABLE);
//else
ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);
/*Iniciar conversión */
ADC1_StartConversion(); >}
principal()
{
TIM2_Config()
TIM4_Config()
AD2_Config; ();
TIM1_Config();
enableInterrupts();
mientras(1)
{
if(ADChange gt; = 1)//Esto es un retraso, con qué frecuencia ingresar
{
AD2_Config();
while(RESET = = ADC1_GetFlagStatus(ADC1_FLAG_EOC));
VoicADLeve = ADC1_GetConversionValue();
AD_Config()
ADChange = 0; = 0;
}
}
}
Dentro de la interrupción ADC
INTERRUPT_HANDLER(ADC2_IRQHandler, 22 )
{
ADC1_ClearITPendingBit(ADC2_IT_EOC);
}
INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
{
uint16_t temp;
temp = ADC1_GetConversionValue(); //Esta es la colección de audio
if(temp lt; min_ad)
{
min_ad = temp
}
if(temp gt; max_ad)
{
max_ad; = temp;
}
ADC1_ClearITPendingBit(ADC1_IT_EOC);
}
Solo te di la parte ADC de este programa
p >