Страница 1 из 2

Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 21:25:05
Unrealee
Возникла необходимость в цифровой шкале для QRP трансивера. Настройка трансивера производится 20 оборотным потенциометром, диапазон выходного напряжения на варикапы от 1,5 до 5,5 вольт. Перестройка очень линейна. В качестве МК планирую использовать МК из состава ланчпада MSP430, а именно m430g2452. По-идее, могу к нему подцепить 13 светодиодов в качестве светодиодной линейки, и останется одна нога для входа АЦП. Возникли следующие вопросы:
могу я использовать ноги xin, xout, rst в качестве выходов?
нужна помощь в написании прошивки, реализующей след. функционал - снять с делителя (приведённый к верхнему порогу +3.3 в) напряжения варикапов, и линейно отобразить их светящейся точкой на шкале.

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 21:39:50
Ser60
Unrealee писал(а):могу я использовать ноги xin, xout, rst в качестве выходов?
xin, xout - да, rst - нет.
Unrealee писал(а):нужна помощь в написании прошивки
Какая конкрето нужна помощь? Если написать за Вас программу - это элементарно и мне неинтересно. Но могу ответить на конкретные вопросы. Для начала почитайте обучалку:
http://we.easyelectronics.ru/msp430/uro ... gnala.html

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 21:46:28
Unrealee
Накидал схемку, сразу возник вопрос - можно ли для упрощения разводки соединить выходы портов 1 и 2 в перемешку со светодиодами, а уже потом в программе поправить?

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 21:53:54
Ser60
Конечно можно. Можно еще повесить пару светодиодов на ноги 18, 19. Аналоговый сигнал следует подавать на входы обозначенные А0 - А5, т.е. ноги 2-7. А вывод rst следует подтянуть на питание через 47Ком и бросить с него на землю кондер в 2200 пф. И обязательно шунтировать выводы питания керамикой в 0.1 мкф.

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 22:09:28
Unrealee
Схема преобразуется в следующий вид.

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 22:12:38
Ser60
Отлично! Но на вывод 3 можно тоже светодиод поставить, если хотите.

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 22:16:56
Unrealee
На третий буду снимать со второго потенциометра.
Возникают следующий вопрос:
Начинаю делать соответствия между битами и портами, получается следующее

Код: Выделить всё

//что бы не запутаться в порядке следования светодиодов
//1 BIT2 1DIR
//2 BIT3 1DIR
//3 BIT4 1DIR
//4 BIT5 1DIR
//5 BIT0 2DIR
//6 BIT1 2DIR
//7 BIT2 2DIR
//8 BIT3 2DIR
//9 BIT4 2DIR
//10 BIT5 2DIR

//11 BIT6 1DIR
//12 BIT7 1DIR
//13 
//14
Каким битам будут соответствовать xin и xout???

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 22:20:13
Ser60
На этот вопрос отвечает распиновка выводов на стр. 3 ДШ. Согласно ей xin = P2.6, xout = P2.7.

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 22:47:55
Unrealee
Начал писать прошивку. Вопросы:
не понимаю как работает функция ADC_init, как в ней установить верхний и нижний предел?
Как реализовать последовательное зажигание светодиодов, на ум лезут конструкции if ... else, может можно проще? Прога:

Код: Выделить всё

#include <msp430g2553.h>

//что бы не запутаться в порядке следования светодиодов
//1 BIT2 1DIR
//2 BIT3 1DIR
//3 BIT4 1DIR
//4 BIT5 1DIR
//5 BIT0 2DIR
//6 BIT1 2DIR
//7 BIT2 2DIR
//8 BIT3 2DIR
//9 BIT4 2DIR
//10 BIT5 2DIR
//11 BIT6 1DIR
//12 BIT7 1DIR
//13 BIT7 2DIR
//14 BIT6 2DIR
void ADC_init(void); 									//объявляем функцию для АЦП
void led_init(void);									//объявляем функцию для вывода горящего светодиода
float volts=0.0;										//объявляем переменную для результата измерения


void main( void )
{

WDTCTL = WDTPW + WDTHOLD;								//отключаем ждущий таймер
P1OUT = 0;												//инициализируем выключенными светодиоды на первом порту
P1DIR &= ~(BIT2+BIT3+BIT4+BIT5+BIT6+BIT7);

P2OUT = 0;												//инициализируем выключенными светодиоды на втором порту
P2DIR &= ~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7);

ADC_init();
led_init();

    for (;;)
    {
        ADC10CTL0 |= ADC10SC;   						// начинаем новое преобразование
        while ((ADC10CTL1 & ADC10BUSY) == 0x01); 		// ждем, когда преобразование закончится
        volts=ADC10MEM; 								//сохраняем результат преобразования
    }





}//main

void ADC_init(void)
{
            											// Используем Vcc/Vss(аналоговая земля) для верхнего/нижнего ИОН,
            											// 16 x ADC10CLKs (выборка за 16 тактов), включаем АЦП.
    ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON;
            											// Вход A1, делитель ADC10CLK на 1, одноканальный режим.
    ADC10CTL1 =  INCH_1 + SHS_0 + ADC10SSEL_0 + ADC10DIV_0 + CONSEQ_0;
    ADC10AE0 = BIT1;      								// Разрешаем вход АЦП на порту P1.1

    ADC10CTL0 |= ENC;     								// Разрешаем преобразования.
} // ADC_init

void led_init(void)
{

}


Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 23:25:39
Ser60
Я совсем не хочу отговаривать Вас от освоения МК и даже наоборот, но может быть для конкретного устройства будет проще применить микросхемы светодиодной шкалы, например LM3914. Поэтому прежде чем продолжать дайте знать насколько сильно/серьезно у Вас желание сделать это устройство на МК.

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 23:47:26
Ser60
АЦП функцией init() уже сконфигурирован на работу с напряжением питания в качестве опорного. А обработку уровней АЦП можно сделать, например, так: разбить интервал кодов АЦП (0 - 1023) на равное число частей по числу светодиодов и затем начать обработку с низшего уровня:

if (volts < низший порог)
включаем первый светик;
if (volts < второй порог)
включаем следующий светик);

и т.д. по числу светиков. Кстати, переменная volts может быть типа int. Согласно предшествующей дискуссии Вы хотель подавать напряжение на вывод 2, что соответствует P1.0, а в коде настройка на P1.1 через BIT1.

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Вс дек 02, 2012 23:54:52
Unrealee
Добавляю делитель на вход. Получается, если входное сопротивление АЦП велико, то его не принимаем во внимание и делитель получится 1,7.
Соответственно, считаю напряжения, при которых загорятся светодиоды (в excel табличке).
Вопросы:
как установить опорные напряжения (нижнее в 1,2 вольта, верхнее в напряжение питания Vss)
Как я понял, чтобы организовать зажигание сетодиода, нужно перевести полученную переменную volts в реальные вольты (умножив на какой-то коэффициент) и организовать сравнение в цикле с определённой частотой переменной с массивом:
если 0<volts<= 1,2 зажигаем первый светодиод, тут же всё гасим, иначе
если 1,2<volts<=1,36 зажигаем второй светодиод, тут же всё гасим, иначе
и т.д.
всё это с частотой 200-300 гц чтобы не видно было мерцания?
Или есть решение по-изящней???

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Пн дек 03, 2012 00:01:16
Unrealee
Ser60 писал(а):Я совсем не хочу отговаривать Вас от освоения МК и даже наоборот, но может быть для конкретного устройства будет проще применить микросхемы светодиодной шкалы, например LM3914. Поэтому прежде чем продолжать дайте знать насколько сильно/серьезно у Вас желание сделать это устройство на МК.
Желание сильное и серьёзное. Это первая моя конструкция на микроконтроллере. Раньше немного программировал моторолловские МК на асме, сейчас работа заставляет изучать серию MSP430 TI. Заказал пару ланчпадов, решил совместить приятное с полезным. (С нового года, наш отдел промышленной автоматизации переходит на MSP430), ведущий программист уволился, так что придётся разбираться...
Ser60 писал(а):Согласно предшествующей дискуссии Вы хотель подавать напряжение на вывод 2, что соответствует P1.0, а в коде настройка на P1.1 через BIT1.
Поправил.

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Пн дек 03, 2012 00:26:12
Ser60
Все понял насчет желания, тогда продолжаем. В принципе нижний порог АЦП можно установить внешним опорником на 1.2в, кот. подключается к выводу 5 корпуса. При этом в битах 13-15 регистра ADC10CTL0 надо поставить 100 (стр. 567 ДШ на семейство 2хх). Иначе, можно и без опорника, просто кодам АЦП соответствующим ниже 1.2в будет соответствовать включение лишь самого нижнего светодиода.

Насчет более элегантного решения все зависит от того что Вы считаете элегантным. Можно, например, создать таблицу с 1024 строками, где каждому коду АЦП будет соответствовать значение подаваемое в порт и все светики загорятся сразу. Памяти на это хватит. Измерять уровень АЦП достаточно каждые 100 мсек, может и раза в 2 реже. Это-же не динамическая индикация, а лишь регулировка времени отклика схемы на изменение напряжения на входе.

Переводить коды АЦП в вольты не нужно. Достаточно все закодить в кодах АЦП, предварительно посчитав в сторонке какому напряжению соответствует какой код.

Кстати, будьте готовы к введению гистерезиса в схему, чтобы исключить мигание соседних светодиодов при подходе напряжения к точке переключения. Но об этом потом, давайте сначала сделаем простой вариант. И зачем Вы пишите этот простой код на С? Как насчет АСМа?

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Пн дек 03, 2012 00:36:48
Unrealee
Ser60 писал(а):Все понял насчет желания, тогда продолжаем. В принципе нижний порог АЦП можно установить внешним опорником на 1.2в, кот. подключается к выводу 5 корпуса. При этом в битах 13-15 регистра ADC10CTL0 надо поставить 100 (стр. 567 ДШ на семейство 2хх). Иначе, можно и без опорника, просто кодам АЦП соответствующим ниже 1.2в будет соответствовать включение лишь самого нижнего светодиода.

Насчет более элегантного решения все зависит от того что Вы считаете элегантным. Можно, например, создать таблицу с 1024 строками, где каждому коду АЦП будет соответствовать значение подаваемое в порт и все светики загорятся сразу. Памяти на это хватит. Измерять уровень АЦП достаточно каждые 100 мсек, может и раза в 2 реже. Это-же не динамическая индикация, а лишь регулировка времени отклика схемы на изменение напряжения на входе.

Переводить коды АЦП в вольты не нужно. Достаточно все закодить в кодах АЦП, предварительно посчитав в сторонке какому напряжению соответствует какой код.

Кстати, будьте готовы к введению гистерезиса в схему, чтобы исключить мигание соседних светодиодов при подходе напряжения к точке переключения. Но об этом потом, давайте сначала сделаем простой вариант. И зачем Вы пишите этот простой код на С? Как насчет АСМа?
Начал накидывать код, заодно выпаял 14 светодиодов из старого хаба :)
Ser60 писал(а): И зачем Вы пишите этот простой код на С? Как насчет АСМа?
Хочу немного разобраться с С. Асм к тому подзабыл, 5 лет на нём не писал. В последнее время писал на Фортране и в G-кодах для ЧПУ.

Сама прога:
#include <msp430g2553.h>

//что бы не запутаться в порядке следования светодиодов
//1 BIT2 1DIR
//2 BIT3 1DIR
//3 BIT4 1DIR
//4 BIT5 1DIR
//5 BIT0 2DIR
//6 BIT1 2DIR
//7 BIT2 2DIR
//8 BIT3 2DIR
//9 BIT4 2DIR
//10 BIT5 2DIR
//11 BIT6 1DIR
//12 BIT7 1DIR
//13 BIT7 2DIR
//14 BIT6 2DIR
void ADC_init(void); //объявляем функцию для АЦП
void led_init(void); //объявляем функцию для вывода горящего светодиода
float volts=0.0; //объявляем переменную для результата измерения


void main( void )
{

WDTCTL = WDTPW + WDTHOLD; //отключаем ждущий таймер
P1OUT = 0; //инициализируем выключенными светодиоды на первом порту
P1DIR &= ~(BIT2+BIT3+BIT4+BIT5+BIT6+BIT7);

P2OUT = 0; //инициализируем выключенными светодиоды на втором порту
P2DIR &= ~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7);

ADC_init();
led_init();

for (;;)
{
ADC10CTL0 |= ADC10SC; // начинаем новое преобразование
while ((ADC10CTL1 & ADC10BUSY) == 0x01); // ждем, когда преобразование закончится
volts=ADC10MEM*0.0032258; //сохраняем результат преобразования
}





}//main

void ADC_init(void)
{
// Используем Vcc/Vss(аналоговая земля) для верхнего/нижнего ИОН,
// 16 x ADC10CLKs (выборка за 16 тактов), включаем АЦП.
ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON;
// Вход A1, делитель ADC10CLK на 1, одноканальный режим.
ADC10CTL1 = INCH_1 + SHS_0 + ADC10SSEL_0 + ADC10DIV_0 + CONSEQ_0;
ADC10AE0 = BIT0; // Разрешаем вход АЦП на порту P1.1

ADC10CTL0 |= ENC; // Разрешаем преобразования.
} // ADC_init

void led_init(void)
{
{
if (volts <= 1.2)
P1OUT |= BIT2; //если напряжение меньше 1.2 включаем первый светодиод
else
P1OUT &= ~BIT2;
}
{
if (volts <= 1.36 && volts > 1.2)
P1OUT |= BIT3; //если напряжение меньше 1.36 и больше 1.2 включаем 2-ой светодиод
else
P1OUT &= ~BIT3;
}



}//led_init off


Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Пн дек 03, 2012 00:52:48
Ser60
Я-бы убрал функцию init_led() и поставил ее тело в конец основного цикла, перепесав его так:

Код: Выделить всё

P1OUT = 0;    // выключаем все светики
if (volts >= 1.2)
  P1OUT |= BIT2; //если напряжение больше 1.2 включаем первый светодиод
if (volts >= 1.36)
  P1OUT |= BIT3; //если напряжение больше 1.36 включаем еще 2-ой светодиод
После всех проверок должна быть задержка миллисек на 100-200. Лучше отправить процессор в сон с пробуждением от таймера. Тогда и для радио помех меньше будет.

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Пн дек 03, 2012 01:30:06
Unrealee

Код: Выделить всё

#include <msp430g2553.h>

//что бы не запутаться в порядке следования светодиодов
//1 BIT2 1DIR
//2 BIT3 1DIR
//3 BIT4 1DIR
//4 BIT5 1DIR
//5 BIT0 2DIR
//6 BIT1 2DIR
//7 BIT2 2DIR
//8 BIT3 2DIR
//9 BIT4 2DIR
//10 BIT5 2DIR
//11 BIT6 1DIR
//12 BIT7 1DIR
//13 BIT7 2DIR
//14 BIT6 2DIR
void ADC_init(void);			 //объявляем функцию для АЦП
float volts=0.0; 				//объявляем переменную для результата измерения


void main( void )
{

WDTCTL = WDTPW + WDTHOLD; 								//отключаем ждущий таймер
P1OUT = 0; 												//инициализируем выключенными светодиоды на первом порту
P1DIR &= ~(BIT2+BIT3+BIT4+BIT5+BIT6+BIT7);

P2OUT = 0; 												//инициализируем выключенными светодиоды на втором порту
P2DIR &= ~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7);

ADC_init();

 for (;;)
 {
 ADC10CTL0 |= ADC10SC; 										// начинаем новое преобразование
 while ((ADC10CTL1 & ADC10BUSY) == 0x01); 					// ждем, когда преобразование закончится
 volts=ADC10MEM*0.0032258; 									//сохраняем результат преобразования
 P1OUT = 0;    // выключаем все светики
 P2OUT = 0;

 if (volts >= 1.2)
   P1OUT |= BIT2; //если напряжение больше 1.2 включаем первый светодиод
 if (volts >= 1.36)
   P1OUT |= BIT3; //если напряжение больше 1.36 включаем еще 2-ой светодиод
 if (volts >= 1.52)
   P1OUT |= BIT4; //если напряжение больше 1.2 включаем 3 светодиод
 if (volts >= 1.69)
   P1OUT |= BIT5;
 if (volts >= 1.85)
   P2OUT |= BIT0;
 if (volts >= 2.01)
	 P2OUT |= BIT1;
 if (volts >= 2.17)
     P2OUT |= BIT2;
 if (volts >= 2.33)
     P2OUT |= BIT3;
 if (volts >= 2.5)
     P2OUT |= BIT4;
 if (volts >= 2.67)
     P2OUT |= BIT5;
 if (volts >= 2.82)
     P1OUT |= BIT6;
 if (volts >= 2.99)
     P1OUT |= BIT7;
 if (volts >= 2.15)
     P2OUT |= BIT7;
 if (volts >= 3.3)
     P2OUT |= BIT6;
 }

}//main

void ADC_init(void)
{
														// Используем Vcc/Vss(аналоговая земля) для верхнего/нижнего ИОН,
														// 16 x ADC10CLKs (выборка за 16 тактов), включаем АЦП.
 ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON;
 	 	 	 	 	 	 	 	 	 	 	 	 	 	// Вход A1, делитель ADC10CLK на 1, одноканальный режим.
 ADC10CTL1 = INCH_1 + SHS_0 + ADC10SSEL_0 + ADC10DIV_0 + CONSEQ_0;
 ADC10AE0 = BIT0; 										// Разрешаем вход АЦП на порту P1.1

 ADC10CTL0 |= ENC; 										// Разрешаем преобразования.
} // ADC_init
Задержка делается через delay ()???

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Пн дек 03, 2012 01:41:47
Ser60
Лучше сделать задержку на таймере, но чтобы попробовать можно и без нее пока.

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Пн дек 03, 2012 02:00:03
Unrealee
Прога в таком виде:

Код: Выделить всё

#include <msp430g2553.h>

//что бы не запутаться в порядке следования светодиодов
//1 BIT2 1DIR
//2 BIT3 1DIR
//3 BIT4 1DIR
//4 BIT5 1DIR
//5 BIT0 2DIR
//6 BIT1 2DIR
//7 BIT2 2DIR
//8 BIT3 2DIR
//9 BIT4 2DIR
//10 BIT5 2DIR
//11 BIT6 1DIR
//12 BIT7 1DIR
//13 BIT7 2DIR
//14 BIT6 2DIR
void ADC_init(void);			 //объявляем функцию для АЦП
float volts=0.0; 				//объявляем переменную для результата измерения


void main( void )
{

WDTCTL = WDTPW + WDTHOLD; 								//отключаем ждущий таймер
P1DIR = (BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);
P1OUT = 0; 												//инициализируем выключенными светодиоды на первом порту
P2DIR = (BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7);
P2OUT = 0; 												//инициализируем выключенными светодиоды на втором порту

ADC_init();

 for (;;)
 {
 ADC10CTL0 |= ADC10SC; 										// начинаем новое преобразование
 while ((ADC10CTL1 & ADC10BUSY) == 0x01); 					// ждем, когда преобразование закончится
 volts=ADC10MEM*0.0032258; 									//сохраняем результат преобразования
 P1OUT = 0;    // выключаем все светики
 P2OUT = 0;

 if (volts >= 1.2)
   P1OUT |= BIT2; //если напряжение больше 1.2 включаем первый светодиод
 if (volts >= 1.36)
   P1OUT |= BIT3; //если напряжение больше 1.36 включаем еще 2-ой светодиод
 if (volts >= 1.52)
   P1OUT |= BIT4; //если напряжение больше 1.52 включаем 3 светодиод
 if (volts >= 1.69)
   P1OUT |= BIT5;
 if (volts >= 1.85)
   P2OUT |= BIT0;
 if (volts >= 2.01)
	 P2OUT |= BIT1;
 if (volts >= 2.17)
     P2OUT |= BIT2;
 if (volts >= 2.33)
     P2OUT |= BIT3;
 if (volts >= 2.5)
     P2OUT |= BIT4;
 if (volts >= 2.67)
     P2OUT |= BIT5;
 if (volts >= 2.82)
     P1OUT |= BIT6;
 if (volts >= 2.99)
     P1OUT |= BIT7;
 if (volts >= 2.15)
     P2OUT |= BIT7;
 if (volts >= 3.3)
     P2OUT |= BIT6;
 }

}//main

void ADC_init(void)
{
														// Используем Vcc/Vss(аналоговая земля) для верхнего/нижнего ИОН,
														// 16 x ADC10CLKs (выборка за 16 тактов), включаем АЦП.
 ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON;
 	 	 	 	 	 	 	 	 	 	 	 	 	 	// Вход A1, делитель ADC10CLK на 1, одноканальный режим.
 ADC10CTL1 = INCH_1 + SHS_0 + ADC10SSEL_0 + ADC10DIV_0 + CONSEQ_0;
 ADC10AE0 = BIT0; 										// Разрешаем вход АЦП на порту P1.1

 ADC10CTL0 |= ENC; 										// Разрешаем преобразования.
} // ADC_init



МК прошился без ошибок, вне зависимости от уровня напряжения на 2-ой ноге, все светодиоды горят :(

Re: Цифровая шкала с LED линейкой на MSP430

Добавлено: Пн дек 03, 2012 02:29:31
Ser60
У меня есть таком МК на работе. Я завтра принесу домой, тогда продолжим.