1. Написать, отладить и протестировать программу управления яркостью свечения зеленого светодиода. Переключение яркости на следующий уровень должно происходить при нажатии кнопки. Количество уровней яркости – не менее четырех. Для каждой градации яркости с помощью вольтметра измерить напряжение на соответствующем выводе микроконтроллера. Результаты измерений свести в таблицу.
#define RED RED_LED
int brightness = 190;
int fadeAmount = 10;
const int buttonPin = PUSH2;
int buttonState = 0;
void setup()
{
pinMode(RED, OUTPUT);// nothing happens in setup
pinMode(buttonPin, INPUT_PULLUP);// nothing happens in setup
}
void loop()
{
buttonState = digitalRead(buttonPin);
// fade in from min to max in increments of 5 points:
if (buttonState == LOW)
{
brightness = brightness - fadeAmount;
}
analogWrite(RED, brightness);
if (brightness == 0) brightness = 190;
delay(30);
}
Напряжения, В:
2.55
1.88
1.34
0.67
0.13
2. Написать, отладить и протестировать программу управления частотой мигания красного светодиода. Управление осуществить с помощью потенциометра R6 (рис. 3.4): положение движка потенциометра должно управлять частотой мигания.
int sensorPin = A6; // select the input pin for the potentiometer
int ledPin = 11; // select the pin for the LED
int sensorValue = 0; // variable to store the value coming from the sensor
void setup() {
// declare the ledPin as an OUTPUT:
pinMode(ledPin, OUTPUT);
}
void loop() {
// read the value from the sensor:
sensorValue = analogRead(sensorPin);
// turn the ledPin on
digitalWrite(ledPin, HIGH);
// stop the program for <sensorValue> milliseconds:
delay(sensorValue);
// turn the ledPin off:
digitalWrite(ledPin, LOW);
// stop the program for for <sensorValue> milliseconds:
delay(sensorValue);
}
3. Написать, отладить и протестировать программу чтения значения аналогового сигнала с движка потенциометра R6. Интервал времени между двумя последовательными чтениями:
· вариант 1 – 200 мс,
· вариант 2 – 300 мс,
· вариант 3 – 400 мс,
· вариант 4 – 500 мс.
Считанное значение сигнала должно передаваться в последовательный порт в двух видах:
· в виде значения выходного кода АЦП,
· в виде значения напряжения, с двумя знаками в дробной части числа, единица измерения [В].
·
const int analogInPin = A6; // Analog input pin that the potentiometer is attached to
const int analogOutPin = 11; // Analog output pin that the LED is attached to
int sensorValue = 0; // value read from the pot
int outputValue = 0; // value output to the PWM (analog out)
double Voltage;
void setup() {
// initialize serial communications at 9600 bps:
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(analogInPin);
Voltage = sensorValue*3.0/1024.0;
outputValue = map(sensorValue, 0, 1023, 0, 255);
analogWrite(analogOutPin, outputValue);
// print the results to the serial monitor:
Serial.print("sensor = " );
Serial.print(sensorValue);
Serial.print("\t output = ");
Serial.println(Voltage);
delay(200);
}
4. Написать, отладить и протестировать программу измерения меняющегося во времени аналогового сигнала и передачи измеренных значений в последовательный порт. Измеряемый сигнал – выходной сигнал фильтра низкой частоты R4C1 (рис. 3.4). Период измерения сигнала – 50 мс. Входной сигнал для фильтра формировать последовательностью импульсов, подаваемых на вход инвертора на транзисторе VT1. Параметры импульсов:
· вариант 1 – период 8с, коэффициент заполнения 0.4, количество импульсов 5.
В последовательный порт передавать значения:
· время от момента старта программы, единица измерения – миллисекунда;
· напряжение на выходе фильтра, 2 знака в дробной части числа, единица измерения – В.
int sensorPin = 15;
int gen = 11;
uint16_t START, TIME;
double Vout;
void setup()
{
pinMode (gen, OUTPUT);
Serial.begin(9600);
}
void measurement()
{
Vout = analogRead(sensorPin)*3.0/1023.0;
Serial.print("time = ");
Serial.print(TIME);
Serial.print("\t output = ");
Serial.println(Vout);
}
void loop()
{
for (int i=0; i<5; i++)
{
START = millis();
digitalWrite(gen, HIGH);
do
{
TIME = millis();
if (TIME%50==0) measurement();
} while (TIME-START<=3200);
digitalWrite(gen, LOW);
START = millis();
do
{
TIME = millis();
if (TIME%50==0) measurement();
} while (TIME-START<=4800);
}
delay(100000);
}
период 8с, коэффициент заполнения 0.4, количество импульсов 5.
Вывод: В ходе лабораторной работы изучили основные средства микроконтроллера MSP430 для ввода-вывода аналоговых сигналов, основных приемов программирования микроконтроллера MSP430 для операций ввода-вывода аналоговых сигналов и передачи результатов измерений по последовательному интерфейсу.