Задание к работе.
Лабораторная работа №6 «Изучение работы АЦП»
Цель работы.
Изучить назначение и настройку аналого-цифрового преобразователя микроконтроллера. Получить базовые навыки описания регистров настройки АЦП при создании программ для прошивки микроконтроллера.
Задание к работе.
1. Ознакомиться со структурной схемой АЦП, назначением всех блоков, входящих в АЦП.
2. Ознакомиться с назначением регистров и их настройкой.
3. Ознакомиться с примером программы для прошивки МК.
4. Написать программу для работы с АЦП по заданию.
5. Ответить на контрольные вопросы.
6. Подготовить отчет по проделанной работе.
Индивидуальные задания.На основе примера программы создать собственную программу по следующим примерным вариантам:
1) Разбить диапазон напряжения 5 В на 5 частей. Переход каждого из диапазонов сопровождается загоранием соответствующего диода.
Листинг 1.
#include "io78f9222.h"
#include <intrinsics.h>
#pragma location="OPTBYTE"
__root const unsigned char optbyte=0x98;
#define LED1 P13_bit.no0
#define LED2 P4_bit.no5
#define LED3 P4_bit.no0
#define LED4 P12_bit.no3
void init_CPU(void)
{WDTM=0x70;
PCC=0x00;
PPCC=0x00;
LSRCM=0x01;
OSTS=0x00;
IF0=0x00;
IF1=0x00;
MK0=0xFF;
MK1=0xFF;}
void init_LED(void)
{PM4_bit.no5=0;
PM4_bit.no0=0;
PM12_bit.no3=0;
P13_bit.no0=1;}
void init_ADC(void)
{PMC2_bit.no0=1;
PM2_bit.no0=1;
}
unsigned char adc_conversion()
{unsigned char result;
ADS=0x00;
ADCE=1;
ADCS=1;
while(!ADIF);
result=ADCRH;
ADCS=0;
ADIF=0;
return result;
}
void main(void)
{unsigned char R,p=1;
__disable_interrupt();
init_CPU();
init_LED();
init_ADC();
__enable_interrupt();
while(p==1)
{R=adc_conversion();
R=R*5/256;
if(R<0.6) {LED1=1;LED2=1;LED3=1;LED4=1;}
if(R>0.6 &&R<1.2) {LED1=1;LED2=1;LED3=1;LED4=0;}
if(R>1.2 &&R<1.8) {LED1=1;LED2=1;LED3=0;LED4=1;}
if(R>1.8 &&R<2.4) {LED1=1;LED2=0;LED3=1;LED4=1;}
if(R>2.4) {LED1=0;LED2=1;LED3=1;LED4=1;}
} }
2) Выбрать любые 2 светодиода. При напряжении на входе 0 В горит один светодиод, при напряжении 5 В загорается другой.
Листинг 2.
#include "io78f9222.h"
#include <intrinsics.h>
#pragma location="OPTBYTE"
__root const unsigned char optbyte=0x98;
#define LED1 P13_bit.no0
#define LED2 P4_bit.no5
#define LED3 P4_bit.no0
#define LED4 P12_bit.no3
void init_CPU(void)
{WDTM=0x70;
PCC=0x00;
PPCC=0x00;
LSRCM=0x01;
OSTS=0x00;
IF0=0x00;
IF1=0x00;
MK0=0xFF;
MK1=0xFF;}
void init_LED(void)
{PM4_bit.no5=0;
PM4_bit.no0=0;
PM12_bit.no3=0;
P13_bit.no0=1;}
void init_ADC(void)
{PMC2_bit.no0=1;
PM2_bit.no0=1;
}
unsigned char adc_conversion()
{unsigned char result;
ADS=0x00;
ADCE=1;
ADCS=1;
while(!ADIF);
result=ADCRH;
ADCS=0;
ADIF=0;
return result;
}
void main(void)
{unsigned char R,p=1;
__disable_interrupt();
init_CPU();
init_LED();
init_ADC();
__enable_interrupt();
while(p==1)
{R=adc_conversion();
R=R*5/256;
if(R>2) {LED1=1;LED2=1;LED3=1;LED4=0;}
else
{LED1=1;LED2=1;LED3=0;LED4=1;} } }
3) Сделать индикатор уровня из 5 светодиодов. Каждый светодиод обозначает уровень напряжения равный 1 В. При увеличении значения пройденный светодиод продолжает светиться.
Листинг 3.
#include "io78f9222.h"
#include <intrinsics.h>
#pragma location="OPTBYTE"
__root const unsigned char optbyte=0x98;
#define LED1 P13_bit.no0
#define LED2 P4_bit.no5
#define LED3 P4_bit.no0
#define LED4 P12_bit.no3
void init_CPU(void)
{WDTM=0x70;
PCC=0x00;
PPCC=0x00;
LSRCM=0x01;
OSTS=0x00;
IF0=0x00;
IF1=0x00;
MK0=0xFF;
MK1=0xFF;}
void init_LED(void)
{PM4_bit.no5=0;
PM4_bit.no0=0;
PM12_bit.no3=0;
P13_bit.no0=1;}
void init_ADC(void)
{PMC2_bit.no0=1;
PM2_bit.no0=1;
}
unsigned char adc_conversion()
{unsigned char result;
ADS=0x00;
ADCE=1;
ADCS=1;
while(!ADIF);
result=ADCRH;
ADCS=0;
ADIF=0;
return result;
}
void main(void)
{unsigned char R,p=1;
__disable_interrupt();
init_CPU();
init_LED();
init_ADC();
__enable_interrupt();
while(p==1)
{R=adc_conversion();
R=R*5/256;
if(R<0.6) {LED1=1;LED2=1;LED3=1;LED4=1;}
if(R>0.6 &&R<1.2) {LED1=1;LED2=1;LED3=1;LED4=0;}
if(R>1.2 &&R<1.8) {LED1=1;LED2=1;LED3=0;LED4=1;}
if(R>1.8 &&R<2.4) {LED1=1;LED2=0;LED3=1;LED4=1;}
if(R>2.4) {LED1=0;LED2=1;LED3=0;LED4=1;}
} }
4) Разбить шкалу диапазон на 10 частей. Переход каждой ½ диапазона сопровождается миганием соответствующего светодиода.
Листинг 4.
#include "io78f9222.h"
#include <intrinsics.h>
#pragma location="OPTBYTE"
__root const unsigned char optbyte=0x98;
#define LED1 P13_bit.no0
#define LED2 P4_bit.no5
#define LED3 P4_bit.no0
#define LED4 P12_bit.no3
void init_CPU(void)
{WDTM=0x70;
PCC=0x00;
PPCC=0x00;
LSRCM=0x01;
OSTS=0x00;
IF0=0x00;
IF1=0x00;
MK0=0xFF;
MK1=0xFF;}
void init_LED(void)
{PM4_bit.no5=0;
PM4_bit.no0=0;
PM12_bit.no3=0;
P13_bit.no0=1;}
void init_ADC(void)
{PMC2_bit.no0=1;
PM2_bit.no0=1;
}
unsigned char adc_conversion()
{unsigned char result;
ADS=0x00;
ADCE=1;
ADCS=1;
while(!ADIF);
result=ADCRH;
ADCS=0;
ADIF=0;
return result;
}
void main(void)
{unsigned char R,p=1;
__disable_interrupt();
init_CPU();
init_LED();
init_ADC();
__enable_interrupt();
while(p==1)
{R=adc_conversion();
R=R*5/256;
if(R<0.3) {LED1=1;LED2=0;LED3=0;LED4=0;}
if(R>0.3 &&R<0,6) {LED1=0;LED2=1;LED3=0;LED4=0;}
if(R>0,6 &&R<0,9) {LED1=0;LED2=0;LED3=1;LED4=0;}
if(R>0,9 &&R<1,2) {LED1=0;LED2=0;LED3=0;LED4=1;}
if(R>1,2 &&R<1,5) {LED1=1;LED2=0;LED3=0;LED4=0;}
if(R>1,5 &&R<1,8) {LED1=0;LED2=1;LED3=0;LED4=0;}
if(R>2,1 &&R<2.4) {LED1=0;LED2=0;LED3=1;LED4=0;}
if(R>2,4 &&R<2,7) {LED1=0;LED2=0;LED3=0;LED4=1;}
if(R>2,7 &&R<3) {LED1=1;LED2=0;LED3=0;LED4=0;}
if(R>3) {LED1=0;LED2=1;LED3=0;LED4=0;}
} }
5) Написать программу бегущие огни так, чтобы количество используемых диодов означало целое значение напряжения на входе (1 В - 1 диод, 2 В – 2 диода и т. д.).
Листинг 5.
#include "io78f9222.h"
#include <intrinsics.h>
#pragma location="OPTBYTE"
__root const unsigned char optbyte=0x98;
#define LED1 P13_bit.no0
#define LED2 P4_bit.no5
#define LED3 P4_bit.no0
#define LED4 P12_bit.no3
return false">ссылка скрытаvoid init_CPU(void)
{WDTM=0x70;
PCC=0x00;
PPCC=0x00;
LSRCM=0x01;
OSTS=0x00;
IF0=0x00;
IF1=0x00;
MK0=0xFF;
MK1=0xFF;}
void init_LED(void)
{PM4_bit.no5=0;
PM4_bit.no0=0;
PM12_bit.no3=0;
P13_bit.no0=1;}
void init_ADC(void)
{PMC2_bit.no0=1;
PM2_bit.no0=1;
}
unsigned char adc_conversion()
{unsigned char result;
ADS=0x00;
ADCE=1;
ADCS=1;
while(!ADIF);
result=ADCRH;
ADCS=0;
ADIF=0;
return result;
}
void main(void)
{unsigned char R,p=1;
__disable_interrupt();
init_CPU();
init_LED();
init_ADC();
__enable_interrupt();
while(p==1)
{R=adc_conversion();
R=R*5/256;
if(R<0.6) {Lshow1(2); LED2=1;LED3=1;LED4=0; LED5=1;}
if(R>0.6 &&R<1.2) { Lshow2(2); LED3=1;LED4=0; LED5=1;}
if(R>1.2 &&R<1.8) { Lshow3(2); LED4=0; LED5=1;}
if(R>1.8 &&R<2.4) { Lshow4(2); LED5=1;}
if(R>2.4) { Lshow5(2);
} }
//pragma vector = INTTM80_VECT
{Timer 80 Flag=0x1;}
Void LShow1(unsigned charm)
{led1=0;
Wait 50(m);
led1=1;
Wait 50(m);
}
Void LShow2(unsigned charm)
{led1=0;
Led2=1;
Wait 50(m);
led1=1;
led2=0;
Wait 50(m);
}
Void LShow3(unsigned charm)
{led3=1;
led1=0;
Wait 50(m);
led1=1;
led2=0;
Wait 50(m);
Led2=1;
Led3=0;
Wait 50(m);
}
Void LShow4(unsigned charm)
{led4=1;
led1=0;
Wait 50(m);
led1=1;
led2=0;
Wait 50(m);
Led2=1;
Led3=0;
Wait 50(m);
Led3=1;
Led4=0;
Wait 50(m);
}
Void LShow(unsigned charm)
{led5=1;
led1=0;
Wait 50(m);
led1=1;
led2=0;
Wait 50(m);
Led2=1;
Led3=0;
Wait 50(m);
Led3=3;
Led4=0;
Wait 50(m);
Led4=1;
Led5=0;
Wait 50(m);
}