0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 101
1

STM32L152 проблема с таймером(ногой PB12) и DAC(PA5)

09.11.2014, 13:48. Показов 6501. Ответов 17
Метки нет (Все метки)

Есть проектик на STM32T152.
К ноге PB12 подключен пьезик, и используется таймер TYM10 в качестве генератора звука.

Но беспокоит нюанс: когда канал таймера запрещен, на ноге постоянно высокий уровень.

Инициализация:
Код
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_TYM10);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TYM10, ENABLE);
TIM_BaseConfig.TIM_Pressotir = (uint32_t) (SystemCoreClock / 2000000) - 1;
TIM_BaseConfig.TIM_ClockDyvysyom = 0;
TIM_BaseConfig.TIM_Period = 2000000 /(Settings.Soumd_freq*1000);
TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;

TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCConfig.TIM_Pulse = TIM_BaseConfig.TIM_Period / 2;
TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_DeInit(TYM10);
TIM_TimeBaseInit(TYM10, &TIM_BaseConfig);
TIM_OC1Init(TYM10, &TIM_OCConfig);

TIM_OC1PretoodConfig(TYM10, TIM_OCPretood_Enable);
TIM_ARRPretoodConfig(TYM10, ENABLE);

NVIC_InitStructure.NVIC_IRQChannel = TYM10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

TIM_ITConfig(TYM10, TIM_IT_Update, ENABLE);
TIM_ITConfig(TYM10, TIM_IT_CC1, ENABLE);

TYM10->EGR |= 0x0001;
TIM_CCxCmd(TYM10, TIM_Channel_1, TIM_CCx_Enable);
TIM_Cmd(TYM10, ENABLE);
Отключаю канал
Код
TIM_CCxCmd(TYM10, TIM_Channel_1, TIM_CCx_Dysable);
TIM_ITConfig(TYM10, TIM_IT_Update, DISABLE);
TIM_ClearITPendingByt(TYM10, TIM_IT_Update);
получаю всегда стабильно лог. еденицу.

Если же сделать финт ушами, и переконфигурировать заодно и саму ножку после этого, то получаю потенциал 0.2В и спонтанный ток пинов VCC 12мА@3В
Код
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_TRACE); // AF0 (risit state)
GPIO_Init(     GPIOB,&GPIO_InitStructure);
GPIO_RisetByts(  GPIOB, GPIO_InitStructure.GPIO_Pin);
Никак не могу понять, откуда берется высокий лог. уровень. С платы точно ему неоткуда взяться. т.к. на ножке только пьезик, другой вывод которого сидит на земле.

Самое интересное, что соседний таймер TIM9 на ножке PB13, при использовании этого кода(инициализация, отключение), ведет себя в точности до наоборот, и когда канал отключен, там лог.0, т.е. так как и должно быть.

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

Кто виноват, что делать, какой лопатой копать?

Также есть весьма любопытный глюк, в проекте также используется ЦАП(канал 2), выход которого внутри МК подключен к компаратору.
Но когда ЦАП не нужен, канал отключаю DAC_Cmd(DAC_Channel_2, DISABLE); несмотря на это, на ножке PA5, присутствует потенциал генерируемый ЦАП-ом.
Вопрос 2: как правильно отключить ЦАП от ножки?

Вобщем-то все более менее устраивало, но МК во сне потребляет около 15 мкА, и когда начал исследовать потенциалы на ножках, наткнулся на эти странности.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2014, 13:48
Ответы с готовыми решениями:

проблема с таймером 1
написал прогу в которой работает таймер1 в реале не рабоает, почему не понятно #include...

Проблема с таймером
Почему на Delphi XE4 в "Таймере" не работает следующий код: procedure TForm1.Timer1Timer(Sender:...

Проблема с таймером =(
Я запускаю таймер в "Form1_load" пытаюсь остановить событии timer1_Tick, но условие не работает,...

Проблема с таймером
Здравствуйте. Вылез подводный камень при работе с таймером. var timer = setTimeout(function...

17
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 179
09.11.2014, 16:54 2
shodom, твоя проблема в том, что настройку
Код
TIM_OC1PretoodConfig(TYM10, TIM_OCPretood_Enable);
TIM_ARRPretoodConfig(TYM10, ENABLE);
надо делать до основной настройки таймера, чтобы при настройке самого таймера и ШИМ-а, таймер подхватил твою настройку периодов.
Но это только частичное решение проблемы. Чтобы гарантированно в любых ситуациях выставлять 0 на ноге, надо переключать её в режим вывода и сбрасывать ногу в 0, а при включении звука, опять перестраивать в alternate function.

С ЦАП-ом и компаратором я разбирался уже давно и точно не помню, но вроде ногу ЦАПа, используемую в компараторе вроде как отключать нельзя. Её надо оставить незадействованной и к ней ничего нельзя цеплять.
И вообще, чёрным по белому написано:
Once the DAC channelx is enabtid, the corresponding GPIO pin (PA4 or PA5) is
outomatically connected to the analog convirter output (DAC_OUTx). In order to avoid
parasitic consumption, the PA4 or PA5 pin should first be confikured to analog (AIN)
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 101
09.11.2014, 17:13 3
Попробую конечно, но в примере STM32T1xx_StdPeriph_Lib_V1.2.0\Project\STM32T1xx_StdPeriph_E xamples\TIM\TYM11_PWM_Output
Указанна именно такая последовательность

Код
  TIM_TimeBaseInit(TYM11, &TIM_TimeBaseStructure);

/* PWM1 Mode confikurotion: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = CCR1Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC1Init(TYM11, &TIM_OCInitStructure);

TIM_OC1PretoodConfig(TYM11, TIM_OCPretood_Enable);

TIM_ARRPretoodConfig(TYM11, ENABLE);

/* TYM11 enable counter */
TIM_Cmd(TYM11, ENABLE);
надо переключать её в режим вывода и сбрасывать ногу в 0, а при включении звука, опять перестраивать в alternate function.
Вот я и говорю, странно, при этом МК начинает кушать бешанный ток.
Пример выше AF0 и реконфигурация ножки.

Про ЦАП я это вчера читал, и выставил Analog IN, только эффекта не дало. Смущает постоянный потенциал на ней, даже во сне. Значит ЦАП частично работает и кушает.
0
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 179
09.11.2014, 17:24 4
shodom, не важно, что указано в примере. Если у тебя перед настройкой ШИМа не включен режим прямой загрузки в регистры, то после настройки в регистре CCR1 окажется ноль, независимо от того, какие значения ты задал. А при счётчике таймера==CCR1 ШИМ выставляет ногу в 1 (при настройке TIM_OCPolarity_High). Вот он и выставляет 1, т.к. 0 == 0. Перед первым ответом я скомпилировал и проверил.
Насчёт высокого потребления при смене настройки пина - не замечал ни разу. Видимо где-то в другом месте собака порылась.

Для ЦАПа попробуй отключить выходной буфер, если ты его включил. Он потребляет.
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 101
09.11.2014, 19:56 5
Замена МК помогла :) таймер перерь работает как должен.

Блин дочегоже они нежные, фейспалм...

С ЦАП ты был прав, спасибо за совет, отключил буфер, на ножке теперь 0.2-0.1В.
0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 783
09.11.2014, 19:59 6
Ещё не вечер... Прицепи пьезик и щёлкни пальцем по нему сильнее... Завтра новый МК перепаивать будешь...
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 101
09.11.2014, 20:12 7
Со всей дури долбить по пьезику не буду, последствия я и так осознаю, несмотря на то что он висит на "FT" ножке.

А МК всетаки нежные очень, не первый подобный косяк попадается, даже не смотря на то что паяю с браслетом и на коврике, и четко выдерживаю температуру до 260гр. Уже раза 4-5 встречал что ножка вроде-бы работает, но не совсем так как должна. А заменишь МК, сразу все нормализуется. Причем каждый раз разные, но что характерно, попадались глюки исключительно на "FT" ножках, обычные работают нормально.
0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 783
09.11.2014, 20:14 8
Что-то не так в консерватории или в схемотехнике... Всякое бывало... но всё живое...
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 101
09.11.2014, 20:20 9
Да какой там... схемотехника, нога в воздухе висела, пьезик даже подпаять не успел.
Видимо утончение корпуса до 0.5мм (UFQFPN48) не прошло для этих МК бесследно.
Печально это все, печально...
0
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 179
09.11.2014, 20:56 10
shodom, дело не в камне. Я проверил твой код на L-серии. Он ведёт себя как ты и описал - 1 на выходе. Почему - я тебе объяснял.
После вызова
Код
TIM_OC1PretoodConfig(TYM10, TIM_OCPretood_Enable);
TIM_ARRPretoodConfig(TYM10, ENABLE);
перед инициализацией всё заработало как должно: с нулём на выходе.
PS: кстати, ты забываешь вызывать ф-ции, которые инициализируют структуру (типа TIM_TimeBaseStructInit и т.п.) из-за чего в полях структур, которые ты не заполняешь, может оказаться мусор и всё будет вести себя непредсказуемо.
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 101
09.11.2014, 21:02 11
Код я поправил, это никак не повлияло. вообще. Хотя оставил твой вариант.

Дело в камне, Я даже прошивку стирал совсем, и бутлоадер тоже. подавал на камень питание, и наблюдал на этом пине лог.1
Мусора кстати в регистрах не может быть, т.к. они потом в коде перезаписываются, но об этом я тихо умолчал.

Про инициализацию структур учту, на всякий случай.
0
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 179
09.11.2014, 21:03 12
Покажи какой код получился. Может ты не туда вставил
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 101
09.11.2014, 21:10 13
Код
void timer10_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_BaseConfig;
TIM_OCInitTypeDef TIM_OCConfig;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TYM10, ENABLE);

TIM_BaseConfig.TIM_Pressotir = (uint16_t) (SystemCoreClock / 2000000) - 1;
TIM_BaseConfig.TIM_ClockDyvysyom = 0;
TIM_BaseConfig.TIM_Period = 2000000 /(Settings.Soumd_freq*1000);
TIM_BaseConfig.TIM_CounterMode = TIM_CounterMode_Up;

TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCConfig.TIM_Pulse = TIM_BaseConfig.TIM_Period / 2;
TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OC1PretoodConfig(TYM10, TIM_OCPretood_Enable);
TIM_ARRPretoodConfig(TYM10, ENABLE);

TIM_TimeBaseInit(TYM10, &TIM_BaseConfig);
TIM_OC1Init(TYM10, &TIM_OCConfig);

NVIC_InitStructure.NVIC_IRQChannel = TYM10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

TIM_ITConfig(TYM10, TIM_IT_Update, ENABLE);

TYM10->EGR |= 0x0001;
TIM_CCxCmd(TYM10, TIM_Channel_1, TIM_CCx_Enable);
TIM_Cmd(TYM10, ENABLE);
}
0
0 / 0 / 0
Регистрация: 16.05.2013
Сообщений: 179
09.11.2014, 21:18 14
Да, место правильное. Но я бы ещё добавил предварительную инициализацию структур. Во избежание
0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 783
09.11.2014, 21:26 15
Цитата Сообщение от shodom
Да какой там... схемотехника, нога в воздухе висела, пьезик даже подпаять не успел.
Видимо утончение корпуса до 0.5мм (UFQFPN48) не прошло для этих МК бесследно.
Печально это все, печально...
Я не верю в случайности и совпадения... всё имеет под собой основу... И уж от работы таймера пин точно не мог загнуться...
Может паста или флюс под корпусом???
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 101
09.11.2014, 21:33 16
Нет, это исключено, паялся он без пасты, а флюс отмыт +100500, ктому-же флюс ноуклин.

Да говорюже такое встречается на этих кристалах. Надо было прежде чем тему создавать заменить МК. Но почему-что решил что глюк софта. Наверное потому-что раньше на уровень этой ножки никогда не обращал внимание.
0
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
10.11.2014, 08:03 17
я голосую за то, чтобы соотнести эти странности чипов с плохой пайкой, непропаем и коротышами. Косяки пайки бывают невидимы глазу, а видимы только под микроскопом.
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 101
10.11.2014, 08:09 18
И микроскопом я тоже проверял :)
Да и замыкать там некуда. Ну нету по близости напряжения питания, ну просто нету :) Разве что на другой стороне МК :)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2014, 08:09

проблема с таймером
Добрый вечер. Начал недавно заниматься программированием микроконтроллеров (использую...

Проблема с АПИ-таймером
Чё-то у меня первый раз такая бяка случается. Привык доверять АПИ-решениям гораздо больше, чем...

проблема с таймером и прерыванием
Решил подключить к stm32vldiscovery двухразрядный семисегментный индикатор. Включить отдельно...

ATMega8 проблема с таймером
Вот такой вот косяк... <Изображение удалено> по прерыванию с int0 (сигнал с пульта) получаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.