/*****************************************************************************
Nome do Arquivo : main.c
Descrição : Arquivo principal prova P2, exercicio 1
Ambiente : WOKWI e RP2040 C/C++ SDK
Responsável : Weslley M. Torres
Versão/Data : 1.0.0 - 25/03/2024 - Initial version
*****************************************************************************/
/******************************************************************************
HEADER-FILES (Somente os arquivos necessários nesse arquivo)
******************************************************************************/
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/adc.h"
#include "hardware/pwm.h"
/*****************************************************************************/
/******************************************************************************
Variaveis Globais
******************************************************************************/
#define L1 8
#define L2 7
#define L3 6
#define L4 5
#define S1 4
#define S2 3
#define S3 2
#define ADC_IO 26
#define ADC_CH 0
/*****************************************************************************/
/******************************************************************************
Prototipos das funções
******************************************************************************/
void system_init(void);
void setup_pwm(uint8_t pino, uint32_t pwm_freq, uint16_t duty_cycle_porc);
void set_duty_cycle(uint8_t pino, uint32_t pwm_freq, uint16_t duty_cycle_porc);
/*****************************************************************************/
/******************************************************************************
Funcao: int main(void)
Entrada: Nenhuma (void)
Saída: Nenhuma (void)
Descrição: Função principal
*****************************************************************************/
int main()
{
uint16_t leitura_ad = 0;
uint32_t resultado = 0;
stdio_init_all();
printf("Microcontroladores - Aula 18\n");
sleep_ms(250);
system_init();
while(1)
{
adc_read();
leitura_ad = adc_read();
resultado = (leitura_ad*100) / 4096;
set_duty_cycle(L1, 1000,resultado);
printf("\n Valor de AD = %d", leitura_ad);
printf("\n Valor de PWM = %d ", resultado);
sleep_ms(150);
}
}
/******************************************************************************
Funcao: void system_init(void)
Entrada: Nenhuma (void)
Saída: Nenhuma (void)
Descrição: Inicializa sistema (microcontrolador e periféricos)
*****************************************************************************/
void system_init(void)
{
printf("Init Hardware ....\n");
sleep_ms(10);
gpio_init(L1);
gpio_set_dir(L1, GPIO_OUT);
gpio_put(L1, 0);
setup_pwm(L1, 1000, 0);
adc_init ();
adc_gpio_init (ADC_IO);
adc_select_input (ADC_CH);
}
void setup_pwm(uint8_t pino, uint32_t pwm_freq, uint16_t duty_cycle_porc)
{
uint8_t slice_num = pwm_gpio_to_slice_num(pino);
uint8_t channel = pwm_gpio_to_channel(pino);
uint32_t clock_sistema = 125000000; // 125MHz
uint16_t top = clock_sistema / pwm_freq- 1;
gpio_set_function(pino, GPIO_FUNC_PWM); // Seleciona pino como PWM
pwm_set_wrap(slice_num, top);
uint16_t level = (top + 1)* duty_cycle_porc / 100;
pwm_set_chan_level(slice_num, channel, level); // Duty cycle inicial
pwm_set_enabled(slice_num, true); // habilita PWM
}
void set_duty_cycle(uint8_t pino, uint32_t pwm_freq, uint16_t duty_cycle_porc)
{
uint8_t slice_num = pwm_gpio_to_slice_num(pino);
uint8_t channel = pwm_gpio_to_channel(pino);
uint32_t clock_sistema = 125000000; // 125MHz
uint16_t top = clock_sistema / pwm_freq- 1;
uint16_t level = (top + 1)* duty_cycle_porc / 100; // Novo duty cycle
pwm_set_chan_level(slice_num, channel, level);
}S1
S2
S3
L1
L2
L3
L4