1 PROJETOS DE TÓPICOS ESPECIAIS 2º SEMESTRE 2015 Professor Dr. Amauri Amorin Assef 1) Controlador PWM com frequência ajustável entre 20 khz e 50 khz (passo de 5 khz), razão cíclica entre 0 e 100% (passo de 5%), e sensor de temperatura LM35. A leitura e configuração dos parâmetros deverá ser realizada de forma serial através de comandos do PC da placa TWR-K60. Iniciar enviando os caracteres para escrever UTFPR na tela do PC: Enviar o título do projeto e o nome dos integrantes da equipe: Desenvolvimento de um controlador PWM com frequência ajustável (20 a 50 khz) e razao ciclica de 0 a 100% Equipe: Digite + para aumentar frequencia Digite - para diminuir Digite 1 para aumentar a razao de trabalho Digite 2 para diminuir a razao de trabalho Quando um valor for atualizado ou a cada 4s deve ser enviada pela placa uma mensagem com os valores atuais de temperatura, frequência e razão cíclica (utilizar interrupção para setar um flag de sinalização). Utilizar um LED da placa TWR-K60 com saída do sinal PWM (PTA10 FTM2_CH0 ou PTA11 FTM2_CH1). 2) Implementar um controlador de servo motor com posicionamento configurado através de valor lido de um trimpot (aumentar e diminuir razão de trabalho) da placa TWR- K60. Através de modulação PWM com período de 20 ms (f = 50 Hz), o posicionamento angular pode ser definido entre os parâmetros de largura mínima de (1 ms), que equivale ao deslocamento do eixo em -90º em relação a posição central, e largura máxima (2 ms), que equivale ao deslocamento do eixo em + 90º da posição central do pulso de controle, conforme exemplificado na Figura 1.
2 Utilizar um LED da placa TWR-K60 com saída do sinal PWM (PTA10 FTM2_CH0 ou PTA11 FTM2_CH1). VCC 0 V VCC 1 ms 20 ms t 0 V VCC 1,5 ms 20 ms t 0 V 2 ms 20 ms t Figura 1 Exemplo de sinais de controle para servo motor. 3) Com base nas rotinas a seguir, escrever as funções para gerar quatro formas de onda através do módulo DAC de 12 bits (0 a 4095) do K60 (registros DAC0_DAT0L e DACx_DAT0H para o DAC0), em função das duas chaves da placa TWR-K60. A chave SW1 (PTA19) incrementa e a chave SW2 (PTE26) decrementa o índice do tipo da onda. Alterar o programa para clock de 50 MHz para gerar uma onda de 60 Hz (período T igual 16,67ms) com 256 amostras de sinais, isto é, atualização do DAC a cada 65,1μs. Equação do DAC: Vout = Vin (1 + DACDAT0[11:0])/4096, onde Vin=3,3V Enviar o sinal de carga do DAC0 para um pino com saída PWM da placa TWR-K60 (PTA10 FTM2_CH0 ou PTA11 FTM2_CH1) O pino de saída do DAC0 está no TP8 (test point 8 - a serigrafia está no lado inferior da placa).
3 Tipo de onda Forma de onda 0 Senóide 1 Quadrada 2 Triangular 3 Dente de Serra Número de pontos Valor mínimo Valor máximo 256 0 4095 // Código exemplo: K60 Learning Modules Rochester Institute of Technology Department of Computer Engineering Authors: Dan Cheung, Josh Watts, Sam Skalicky Title: Lab 7 - DAC Description: In this lab we output 4 different signals using the DAC & switch between which is currently being outputted using SW1 & SW2 as inputs Date: 8/1/2011 Revision: 1.0 Filename: main.c / #include "derivative.h" include peripheral declarations / This function sets the required registers to operate the peripherals correctly / void K60_setup() { //Button/LED Setup SIM_SCGC5 = SIM_SCGC5_PORTA_MASK SIM_SCGC5_PORTE_MASK; //enable LED/SW clk PORTA_PCR11 = PORT_PCR_MU(0x01); // E1 PORTA_PCR28 = PORT_PCR_MU(0x01); // E2 PORTA_PCR19 = PORT_PCR_MU(0x01) PORT_PCR_PE_MASK PORT_PCR_PS_MASK; // SW1 PORTE_PCR26 = PORT_PCR_MU(0x01) PORT_PCR_PE_MASK PORT_PCR_PS_MASK; // SW2 GPIOA_PDDR = (1 << 11) (1 << 28); // Set PTA11 and PTA28 to output This function is provided with a reference counter variable (dac_cnt) and manages the counting & outputs value to generate a sawtooth wave
4 / long sawtooth(long dac_cnt) { if((dac_cnt) < 8191) (dac_cnt)++; (dac_cnt) = 0; return (dac_cnt)/2; This function is provided with a reference counter variable (dac_cnt) and manages the counting & output value to generate a square wave / long square(long dac_cnt) { if((dac_cnt) < 8191) (dac_cnt)++; (dac_cnt)=0; if((dac_cnt) < 4096) return 0; return 4095; This function is provided with a reference counter variable (dac_cnt) and manages the counting & output value to generate a triangular wave / long triangular(long dac_cnt) { if((dac_cnt) < 8191) (dac_cnt)++; (dac_cnt) = 0; if ((dac_cnt) < 4096) return (dac_cnt); return (8191 - (dac_cnt)); //sine wave lookup table long sine_table[256] = { 128,131,134,137,140,143,146,149,152,155,158,162,165,167,170,173,176,179,182, 185,188,190,193,196,198,201,203,206,208,211,213,215,218,220,222,224,226,228, 230,232,234,235,237,238,240,241,243,244,245,246,248,249,250,250,251,252,253, 253,254,254,254,255,255,255,255,255,255,255,254,254,254,253,253,252,251,250, 250,249,248,246,245,244,243,241,240,238,237,235,234,232,230,228,226,224,222, 220,218,215,213,211,208,206,203,201,198,196,193,190,188,185,182,179,176,173, 170,167,165,162,158,155,152,149,146,143,140,137,134,131,128,124,121,118,115, 112,109,106,103,100,97,93,90,88,85,82,79,76,73,70,67,65,62,59,57,54,52,49, 47,44,42,40,37,35,33,31,29,27,25,23,21,20,18,17,15,14,12,11,10,9,7,6,5,5, 4,3,2,2,1,1,1,0,0,0,0,0,0,0,1,1,1,2,2,3,4,5,5,6,7,9,10,11,12,14,15,17,18, 20,21,23,25,27,29,31,33,35,37,40,42,44,47,49,52,54,57,59,62,65,67,70,73, 76,79,82,85,88,90,93,97,100,103,106,109,112,115,118,121,124, ; This function is provided with a reference counter variable (dac_cnt) and manages the counting & output value to generate a sine wave / long sine(long dac_cnt) { (dac_cnt)++; if((dac_cnt) == 8191) (dac_cnt) = 0; return sine_table[(dac_cnt)/32]16;
5 int main(void) { char type=0; long changed=0; long dac_cnt = 0; unsigned dac_val=0; K60_setup(); //DAC SIM_SCGC2 = SIM_SCGC2_DAC0_MASK; //enable DAC clk DAC0_C0 = 0xC0; //binary = 11000000 DAC Settings 1 DAC0_C1 = 0x0; //binary = 00000000 DAC Settings 2 for(;;) { //check SW1 if((gpioa_pdir & (1 << 19))!= 0) { //push detected (debounce) changed++; //clear led GPIOA_PCOR = (1 << 11); { //set led GPIOA_PSOR = (1 << 11); //set type if(changed > 10000 && type > 0) { type--; //decrement type dac_cnt = 0; //reset dac_cnt changed = 0; //button released //check SW2 if ((GPIOE_PDIR & (1 << 26))!= 0) { //push detected (debounce) changed++; //set led GPIOA_PSOR = (1 << 28); { //clear led GPIOA_PCOR = (1 << 28); //set type if(changed > 10000 && type < 3) { type++; //increment type dac_cnt = 0; //reset dac_cnt changed = 0; //button released //check type switch(type) { case 0: dac_val = sawtooth(&dac_cnt); //output sawtooth wave break; case 1: dac_val = square(&dac_cnt); //output square wave break; case 2: dac_val = sine(&dac_cnt); //output sine wave break; default: dac_val = triangular(&dac_cnt);//output triangular wave //Set DAC output value (12bit) DAC0_DAT0L = (char)(dac_val & 0x00FF); DAC0_DAT0H = (char)(dac_val >> 8); //set low 8 bits //set high 4 bits return 0;
4) Escrever um tutorial na forma de artigo sobre um dos módulos do microcontrolador MK60DN512VMD10 (ver manual K60 Sub-Family Reference Manual.pdf). No documento deve constar obrigatoriamente as seguintes seções: Resumo, Palavras chave, Introdução, Materiais e Métodos, Resultados e Conclusões. Deve ser incluído um ou mais exemplos de exercícios e os resultados (códigos, imagens, fotos, tela do osciloscópio, etc.). Obs: Entregar até a penúltima semana de aula e utilizar o modelo (template) disponível no site do professor Amauri Assef. 6