Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LABORATORIO DE
CONTROL CON MICROPROCESADORES
TRABAJO PREPARATORIO
Práctica No: 10
Grupo: GR-6
o Paso bajo.
o Paso alto.
o Paso banda.
o Elimina banda.
El filtro activo pasa bajo de Butterworth, debido a su respuesta plana, se suele usar en los filtros
anti-aliasing y en aplicaciones de conversión de datos; en general, donde sea necesario
conseguir una buena precisión de medida en la banda de paso.
Fig. 1 Respuesta en frecuencia del filtro activo pasa baja de Butterworth para distintos
órdenes.
El filtro de Butterworth es uno de los filtros electrónicos más básicos y es diseñado para producir
la respuesta más plana que sea posible hasta la frecuencia de corte. Es decir, la salida se
mantiene constante casi hasta la frecuencia de corte, luego disminuye a razón de 20n dB por
década (o ~6n dB por octava), donde n es el número de polos del filtro.
El Butterworth es el único filtro que mantiene el mismo formato para órdenes más elevadas (sin
embargo, con una inclinación más empinada en la banda atenuada) mientras otras variedades
de filtros (Bessel, Chevyshev, elíptico) poseen formatos diferentes para órdenes más elevadas.
Una de las desventajas de este tipo de filtro es que la transición entre la banda pasante y la
banda de corte puede ser muy extensa. Por tal motivo, para mejorar el corte del filtro es
necesario implementar un filtro de mayor orden.
Fig. 2 Respuesta en frecuencia del filtro activo pasa baja de Butterworth para distintos órdenes.
Donde:
Código Principal:
/* USER CODE BEGIN Header TIM_HandleTypeDef htim2;
*/ TIM_HandleTypeDef htim4; valor=HAL_ADC_GetValue(&ha
/** TIM_HandleTypeDef htim11; dc1);
TIM_HandleTypeDef htim1;
__HAL_TIM_SET_COMPARE(&hti }else{
/* USER CODE END 0 */ m4,TIM_CHANNEL_1,73-1);
__HAL_TIM_SET_COMP
/** ARE(&htim11,TIM_CHANNEL_1,
* @brief The HAL_TIM_Base_Start(&htim2) tempo);
application entry point. ; }
* @retval int }
*/
int main(void) //HAL_ADC_Start_IT(&hadc1)
{ ; if(aux==1 &&
/* USER CODE BEGIN 1 */ __HAL_TIM_GET_COUNTER(&hti
/* USER CODE END 2 */ m1)>90){
for(uint8_t
i=0;i<73;i++){ /* Infinite loop */ tempo++;
/* USER CODE BEGIN WHILE
tabla_sen[i]=36.5 */ if(tempo==73){
+ 36.5 * while (1)
sin(i*(360.0/73.0)*(pi/180 { aux=0;
.0)); /* USER CODE END WHILE
} */ tempo--;
/** } /**
* @brief TIM11 * @brief This function
Initialization Function /** is executed in case of
* @param None * @brief GPIO error occurrence.
* @retval None Initialization Function * @retval None
*/ * @param None */
static void * @retval None void Error_Handler(void)
MX_TIM11_Init(void) */ {
{ static void /* USER CODE BEGIN
MX_GPIO_Init(void) Error_Handler_Debug */
/* USER CODE BEGIN { /* User can add his own
TIM11_Init 0 */ GPIO_InitTypeDef implementation to report
GPIO_InitStruct = {0}; the HAL error return state
/* USER CODE END */
TIM11_Init 0 */ /* GPIO Ports Clock
Enable */ /* USER CODE END
TIM_OC_InitTypeDef Error_Handler_Debug */
sConfigOC = {0}; __HAL_RCC_GPIOA_CLK_ENABLE }
();
/* USER CODE BEGIN #ifdef USE_FULL_ASSERT
TIM11_Init 1 */ __HAL_RCC_GPIOD_CLK_ENABLE /**
(); * @brief Reports the
/* USER CODE END name of the source file
TIM11_Init 1 */ __HAL_RCC_GPIOB_CLK_ENABLE and the source line number
htim11.Instance = TIM11; (); * where the
htim11.Init.Prescaler = assert_param error has
15; /*Configure GPIO pin occurred.
htim11.Init.CounterMode Output Level */ * @param file: pointer
= TIM_COUNTERMODE_UP; HAL_GPIO_WritePin(GPIOA, to the source file name
htim11.Init.Period = 72; GPIO_PIN_4|GPIO_PIN_5, * @param line:
GPIO_PIN_RESET); assert_param error line
htim11.Init.ClockDivision source number
= TIM_CLOCKDIVISION_DIV1; /*Configure GPIO pin * @retval None
Output Level */ */
htim11.Init.AutoReloadPrel void assert_failed(uint8_t
oad = HAL_GPIO_WritePin(SPWM_GPI *file, uint32_t line)
TIM_AUTORELOAD_PRELOAD_DIS O_Port, SPWM_Pin, {
ABLE; GPIO_PIN_RESET); /* USER CODE BEGIN 6 */
if /* User can add his own
(HAL_TIM_Base_Init(&htim11 /*Configure GPIO pins : implementation to report
) != HAL_OK) PA4 PA5 */ the file name and line
{ GPIO_InitStruct.Pin = number,
Error_Handler(); GPIO_PIN_4|GPIO_PIN_5; tex: printf("Wrong
} GPIO_InitStruct.Mode = parameters value: file %s
if GPIO_MODE_OUTPUT_PP; on line %d\r\n", file,
(HAL_TIM_PWM_Init(&htim11) GPIO_InitStruct.Pull = line) */
!= HAL_OK) GPIO_NOPULL; /* USER CODE END 6 */
{ GPIO_InitStruct.Speed = }
Error_Handler(); GPIO_SPEED_FREQ_LOW; #endif /* USE_FULL_ASSERT
} HAL_GPIO_Init(GPIOA, */
sConfigOC.OCMode = &GPIO_InitStruct);
TIM_OCMODE_PWM1; /************************
sConfigOC.Pulse = 0; /*Configure GPIO pin : (C) COPYRIGHT
sConfigOC.OCPolarity = SPWM_Pin */ STMicroelectronics
TIM_OCPOLARITY_HIGH; GPIO_InitStruct.Pin = *****END OF FILE****/
sConfigOC.OCFastMode = SPWM_Pin;
TIM_OCFAST_DISABLE;
Diagrama de flujo:
Como se puede ver en la figura 7, en la vida real ah pasado mas de 5 minutos, mientras que en
la simulación en Proteus ah pasado 1 segundo y medio, es por esto que no se puede apreciar el
cambio de amplitud, y se optó por suprimir esta característica en la simulación.
Referencias:
[1] N. Sotomayor. Control con microprocesadores, abril 2020, Escuela Politécnica Nacional.