Задание к работе.

Лабораторная работа №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);

}