Например TDA7294

Форум РадиоКот • Просмотр темы - MSP430 Генерация пачки импульсов при помощи таймера А
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Чт мар 28, 2024 11:00:57

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 41 ]  1, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Чт апр 06, 2017 17:12:45 
Первый раз сказал Мяу!

Зарегистрирован: Чт апр 06, 2017 16:59:44
Сообщений: 25
Рейтинг сообщения: 0
Дорогие мои друзья, коллеги, товарищи!

Нужна Ваша помощь!
Необходимо генерировать пачку импульсов (частота 40 кГц) с выхода Timer A на MSP430f149 с определенным интервалом.
Данная задача необходима для ультразвукового детектора.

К сожалению, сейчас получается лишь подавать импульсы с частотой 40 кГц без остановки.
Пример листинга:

void timerA_PWM()
{
//задаем частоту ШИМ
TACCR0=18;
//устанавливаем длительность импульса
TACCR1=10;
//устанавливаем режим вывода «Сброс/Установка» (111)
TACCTL1=OUTMOD_7;
//выбираем SMCLK в качестве источника тактирования
//режим «Вверх»
TACTL=TASSEL_2 +MC_1;
}

void timerA_pause()
{
//задаем интервал времени между измерениями
TACCR0 = 12000-1;
//разрешаем прерывания от таймера
TACCTL0 = CCIE;
//режим «Вверх»;
//коэффициент деления для входной тактовой частоты = 8
//выбираем ACLK в качестве источника тактирования таймера
//устанавливаем бит очистки таймера A
TACTL = MC_1|ID_3|TASSEL_1|TACLR;
}

//Обработчик прерывания таймера A
#pragma vector = TIMERA0_VECTOR
__interrupt void TIMERA0_VECTOR_ISR(void)
{
//Перевод таймера А в режим формирования ШИМ
timerA_PWM();
//Пауза для формирования пачки импульсов и захвата
_delay_cycles(1000);
//Перевод таймера А в режим ожидания
timerA_pause();
}

Помогите милой даме разобраться, пожалуйста!))))))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Чт апр 06, 2017 18:29:36 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
подзабыл MSP430, по настройкам таймера не подскажу, но тут попробую покритиковать:
Код:
//Обработчик прерывания таймера A
#pragma vector = TIMERA0_VECTOR
__interrupt void TIMERA0_VECTOR_ISR(void)
{
//Перевод таймера А в режим формирования ШИМ
timerA_PWM();
//Пауза для формирования пачки импульсов и захвата
_delay_cycles(1000);
//Перевод таймера А в режим ожидания
timerA_pause();
}

критика:
1) паузы в прерываниях обычно не делают
2) _delay_cycles(1000); сильно мало
3) после перевода таймера А в режим ожидания имхо пауза тоже нужна
в ИАРе MSP430, как и в AVR можно сделать функции задержки так:
Код:
#define XTALL         16.0
#define delay_us(us)   __delay_cycles (XTALL * us);
#define delay_ms(ms)   delay_us (1000 * ms)

попробовать применить можно так, желательно перенести в main:
Код:
//Перевод таймера А в режим формирования ШИМ
timerA_PWM();
//Пауза для формирования пачки импульсов и захвата
delay_ms(100); // задержка в mS
//Перевод таймера А в режим ожидания
timerA_pause();
delay_ms(100);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Чт апр 06, 2017 21:57:58 
Первый раз сказал Мяу!

Зарегистрирован: Чт апр 06, 2017 16:59:44
Сообщений: 25
Рейтинг сообщения: 0
попробовать применить можно так, желательно перенести в main:
Код:
//Перевод таймера А в режим формирования ШИМ
timerA_PWM();
//Пауза для формирования пачки импульсов и захвата
delay_ms(100); // задержка в mS
//Перевод таймера А в режим ожидания
timerA_pause();
delay_ms(100);
[/quote]

Т.е. ничего не записывать в прерывание?


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Пт апр 07, 2017 04:49:29 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Terminator_2017 писал(а):
Т.е. ничего не записывать в прерывание?

имхо не нужно прерывание:
1) включили шим
2) выдержали паузу
3) выключили шим
4) выдержали паузу
5) переход в пункт 1)

||||||||||||||||||______________||||||||||||||||||______________||||||||||||||||||______________ :)


Вернуться наверх
 
Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Пт апр 07, 2017 11:26:59 
Первый раз сказал Мяу!

Зарегистрирован: Чт апр 06, 2017 16:59:44
Сообщений: 25
Рейтинг сообщения: 0
Спасибо большое, oleg110592, за то что Вы так быстро мне ответили.

Я уже пробовала в main, без прерывания сделать, но к сожалению, ничего не получается. Либо просто высокий уровень, либо импульсы без остановки.

Может быть есть какой-то еще способ отправлять пачку импульсов?


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Пт апр 07, 2017 14:17:04 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
так бы попробовал:
Код:
#define XTALL         16.0
#define delay_us(us)   __delay_cycles (XTALL * us);
#define delay_ms(ms)   delay_us (1000 * ms)

void timerA_PWM()
{
//задаем частоту ШИМ
    TACCR0=18;
//устанавливаем длительность импульса
    TACCR1=10;
//устанавливаем режим вывода «Сброс/Установка» (111)
    TACCTL1=OUTMOD_7;
//выбираем SMCLK в качестве источника тактирования
//режим «Вверх»
   TACTL |= TASSEL_2
}

void main()
{
...............
...............
        timerA_PWM();
   while(1)
   {
      TACTL |= MC_1; // Timer ON
      delay_ms(100);
      TACTL &= ~MC_1; // Timer OFF
      delay_ms(100);
   }
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Пт апр 07, 2017 21:08:00 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Terminator_2017, можно ещё оперировать не включением/отключением таймера, а направлением выхода. Т.е. ШИМ постоянно молотит, а в определённые времена настраиваем его вывод на вход или выход.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Сб апр 08, 2017 10:57:55 
Первый раз сказал Мяу!

Зарегистрирован: Чт апр 06, 2017 16:59:44
Сообщений: 25
Рейтинг сообщения: 0
oleg110592 писал(а):
так бы попробовал:
Код:
#define XTALL         16.0
#define delay_us(us)   __delay_cycles (XTALL * us);
#define delay_ms(ms)   delay_us (1000 * ms)

void timerA_PWM()
{
//задаем частоту ШИМ
    TACCR0=18;
//устанавливаем длительность импульса
    TACCR1=10;
//устанавливаем режим вывода «Сброс/Установка» (111)
    TACCTL1=OUTMOD_7;
//выбираем SMCLK в качестве источника тактирования
//режим «Вверх»
   TACTL |= TASSEL_2
}

void main()
{
...............
...............
        timerA_PWM();
   while(1)
   {
      TACTL |= MC_1; // Timer ON
      delay_ms(100);
      TACTL &= ~MC_1; // Timer OFF
      delay_ms(100);
   }
}


Большое спасибо!
Я поменяла выход на 1.6/ТА1 и данный код заработал. Но не понимаю почему первые два раза, когда таймер останавливается, сигнал низкого уровня, а следующие две остановки сигнал с выхода остается на высоком уровне.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Сб апр 08, 2017 12:56:46 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Terminator_2017 писал(а):
Но не понимаю почему первые два раза, когда таймер останавливается, сигнал низкого уровня, а следующие две остановки сигнал с выхода остается на высоком уровне.

Таймер выключаем в неопределенный момент - какое состояние пина было когда шим работал, такое и осталось. Тут поcле выключения таймера можно принудительно пин установить в "0" так: P1OUT &= ~(1<<6);


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Сб апр 15, 2017 10:36:16 
Первый раз сказал Мяу!

Зарегистрирован: Чт апр 06, 2017 16:59:44
Сообщений: 25
Рейтинг сообщения: 0
Не получается все равно сделать так, чтобы после подачи импульсов был низкий уровень.
Пробовала так:
WDTCTL=WDTPW+WDTHOLD;

timerA_PWM();
while(1)
{
TACTL |= MC_1; // Timer ON
delay_us(125);
TACTL &= ~MC_1; // Timer OFF
P1OUT &= ~(1<<7);
delay_ms(100);
}

Что я делаю не так?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Сб апр 15, 2017 11:12:22 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
Terminator_2017 писал(а):

P1OUT &= ~(1<<7);
Что я делаю не так?

Terminator_2017 писал(а):
Я поменяла выход на 1.6/ТА1

не оно?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Сб апр 15, 2017 11:21:20 
Первый раз сказал Мяу!

Зарегистрирован: Чт апр 06, 2017 16:59:44
Сообщений: 25
Рейтинг сообщения: 0
Пробовала и P1OUT &= ~(1<<6);, но все равно чередуется, то задержка на низком, то на высоком уровне


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Сб апр 15, 2017 12:02:19 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 482
Зарегистрирован: Сб сен 10, 2011 17:46:25
Сообщений: 3832
Рейтинг сообщения: 0
глянул док. - подзабыл о P1SEL
Код:
while(1)
{
P1SEL |= (1<<6);
TACTL |= MC_1; // Timer ON
delay_us(125);
TACTL &= ~MC_1; // Timer OFF
P1SEL &= ~(1<<6);
P1OUT &= ~(1<<6);
delay_ms(100);
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Ср май 03, 2017 17:18:35 
Первый раз сказал Мяу!

Зарегистрирован: Чт апр 06, 2017 16:59:44
Сообщений: 25
Рейтинг сообщения: 0
Товарищи,

А как можно реализовать все-таки через прерывания
К сожалению способ выше заставляет первый и последний импульс в пачке дрожать + нужно в паузу реализовать включение таймера А в режиме захвата


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Чт май 04, 2017 05:55:57 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2800
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18030
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
использовать еще один таймер.
первый таймер - собственно генерация требуемых импульсов в пачке.
второй таймер - формирует "окно" требуемой длительности для пачки.

в прерывании второго таймера (например, переполнение - это "сигнал" окончания "окна") делаем следующее:
- выключаем первый таймер (конец пачки),
- выключаем второй таймер,
- переводим первый таймер в режим захвата, и включаем его,
- формируем "сигнал" для начала отсчета паузы между пачками.

а еще лучше применить третий таймер для задания периода следования пачек, а не применять программную задержку.
именно программная задержка может быть причиной дрожания времени начала пачки, так как начало отсчета задержки будет зависеть от выполнения разных условий в программном цикле.
этот третий таймер
- включает первый таймер в режиме ШИМ,
- включает второй таймер для отсчета "окна".
ну, а взаимодействия первого и второго таймеров между собой я уже описал.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Пн май 15, 2017 16:09:00 
Первый раз сказал Мяу!

Зарегистрирован: Чт апр 06, 2017 16:59:44
Сообщений: 25
Рейтинг сообщения: 0
Добрый день,

Не поняла про три таймера.

Возможно можно как-то использовать лишь ССR0 и прерывание?

На одном из форумов мне предложили следующий алгоритм:"Use the CCR0 interrupt to count the number of periods, after counting to five then turn off the output accordingly and readjust the value of CCR0 to the desired delay, then on the next interrupt change CCR0 back to the pulse period and re-start the output."

Но я не понимаю как это реализовать. Возможно кто-то решал такую задачу?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Пн май 15, 2017 16:32:05 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 607
Зарегистрирован: Ср дек 24, 2008 09:58:58
Сообщений: 3707
Рейтинг сообщения: 0
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Я помогу реализовать этот подход в коде, напишите какие должны быть длительности пачки и паузы.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Пн май 15, 2017 16:44:23 
Первый раз сказал Мяу!

Зарегистрирован: Чт апр 06, 2017 16:59:44
Сообщений: 25
Рейтинг сообщения: 0
Добрый день, Ser60

Период одного импульса 25 мкс (9 сек длительность импульса) Я тактирую от внутреннего генератора (720 кГц), поэтому вот такие значения соответствуют: TACCR0= 18; и TACCR1=7;
Пачка состоит из 5 импульсов = 125 мкс длительность одной пачки

Пауза между пачками должна быть около 200 - 300 мс.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Вт май 16, 2017 06:39:16 
Друг Кота
Аватар пользователя

Карма: 74
Рейтинг сообщений: 607
Зарегистрирован: Ср дек 24, 2008 09:58:58
Сообщений: 3707
Рейтинг сообщения: 0
Медали: 3
Мявтор 1-й степени (1) Мявтор 2-й степени (1) Мявтор 3-й степени (1)
Вот Вам рабочий код. У меня нет MSP430F149, поэтому я его протестил на MSP430G2553.

Не знаю как Вы сгенерировали частоту 720 кгц, я установил её на скорою руку приблизительно в функции Clock_config(), при этом частота импульсов в пачке получилась около 37 кгц. Переменная timerMode в программе отвечает за работу таймера в режиме генерации импульсов (timerMode=0) или паузы (timerMode=1). Число импульсов в пачке и длительность паузы устанавливаются константами PULSE_CNT и PAUSE_CNT в начале файла и отсчитывается переменными pulseCn и pauseCnt в обработчике прерывания таймера. Во время генерации импульсов выходной режим пина таймера установлен в OUTMODE_7, как в Вашей программе, а на время генерации паузы он меняется на OUTMOD_5 (reset) также в обработчике прерывания. Будут вопросы по коду - отвечу. Вот снятая осциллограмма работы.
Вложение:
burst.png [40.93 KiB]
Скачиваний: 594


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: MSP430 Генерация пачки импульсов при помощи таймера А
СообщениеДобавлено: Вт май 16, 2017 19:43:28 
Первый раз сказал Мяу!

Зарегистрирован: Чт апр 06, 2017 16:59:44
Сообщений: 25
Рейтинг сообщения: 0
Спасибо большое за пример кода!

Подскажите, а для чего цикл while?

А также я немного переделала под свой мсп и код прерывания получился такой:
#pragma vector=TIMER0_A1_VECTOR // TimerA handler
__interrupt void TimerA_ISR(void)
{

//(TACTL & TAIFG)=0;
// TA0CTL_bit.TAIFG = 0; // clear TimerA interrupt
1 ---------- (timerMode)
{

if (!(--pauseCnt)) // pause is over is complete
{

pauseCnt = PAUSE_CNT; // restore pause counter
timerMode = 0; // switch to the other mode
TACCTL1 = OUTMOD_7; // toggle mode
}
}
else
{
2 ---------- (!(--pulseCnt)) // burst is complete
{

pulseCnt = PULSE_CNT; // restore pulse counter
timerMode = 1; // switch to the other mode
TACCTL1 = OUTMOD_5; // reset mode
}
}
}

В прерывание входит, но ходит только по двум строчкам (указала в коде)
К сожалению не смогла посмотреть что на осциллографе. Поэтому пыталась зажигать светодиод, чтобы понять как долго он горит во время паузы, но ничего.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  1, ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y