Среда, 04.12.2024, 17:38
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | ARM STM32 F4 с чего начать? - Страница 6 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ВитГо  
ARM STM32 F4 с чего начать?
uwrteyДата: Суббота, 07.06.2014, 23:58 | Сообщение # 76
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
Ух... Разжевал - СПАСИБО Большущее!
( А я и внимания не обратил что STM32F4 и STM32F10xxxx разные ) facepalm мало того что не понял, да еще и запутал сам себя....

да, AVR и рядом с STM32 не стоял....

А еще мне очень нравится, что система тактирования ОЧЕНЬ гибкая...
Тот-же таймер может использовать предделитель с любым значением ( от 1 до 65'535 )

полезности:
http://www.st.com/st-web-....457.pdf
http://www.diary.ru/~teplofizik/p188402343.htm

экселевский файлик ни как не прикрепляется - по этому - вот просто ссылка https://code.google.com/p....?r=1289


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Воскресенье, 08.06.2014, 01:18
 
ВитГоДата: Воскресенье, 08.06.2014, 05:24 | Сообщение # 77
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
ну да, с тактированием помудрили конкретно.. все таки в stm32 много периферии, поэтому и тактов нужно много и разных..

f1 и f4 отличаются сильно, поэтому перепрыгивать с одного семейства на другое достаточно трудно... опять таки используя SPL удается немного упростить задачу, но все равно нужно тщательно все смотреть, поэтому я пока программирую только f4


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 08.06.2014, 14:41 | Сообщение # 78
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
На f4 мало примеров в сети. На том-же f1 их намного больше. Я зачастую смотрю примеры именно на f1 ( тот же ДиХальт ), а потом в своем мозгу забываю, что F1 отличается от F4 и начинаю жутко тупить...

не успеваю за своими мыслями......
 
ВитГоДата: Воскресенье, 08.06.2014, 18:31 | Сообщение # 79
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
1) смотри в сторону SPL
2) в поиске когда забиваешь вопрос сразу пиши дописку STM32F4 - сразу будешь получать нужные результаты...

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

выигрышь появляется когда на асме пишешь.. но асм на STM32 это нечто :-) да и нет ассемблера нормального.. одни затыки :-( большой проект в кокосе на асме не знаю как писать (я пробовал, замучался файлы линковать... не заточен кокос под асм).. да и ассемблер все таки для более простых контроллеров типа AVR эффективен..


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 08.06.2014, 18:53 | Сообщение # 80
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
Хотел серву прикошачить к своему ШИМу - не работает и все..
Оказывается питается STM-ка от 3,3 вольт!
Придется драйвер собирать...


не успеваю за своими мыслями......
 
ВитГоДата: Воскресенье, 08.06.2014, 19:14 | Сообщение # 81
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
ну да, для сервы может оказаться критичным напряжение... сделай повторитель на транзисторе... частота то смешная, любой подойдет

Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 08.06.2014, 23:55 | Сообщение # 82
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
Драйвер сделал из транзистора IRF540N
Попробовал управлять им от 5 вольт - все нормально.
Прилепил все это к STM32F4Discovery - и не работает... Либо напряжения в 3,3 вольта маловато, либо в коде ошибка...

Код

// буду учиться делать шим для сервы...

// на плате дискавери будет интересно наблюдать за плавностью свечения светодиодов
// *** тим_4 ченнел_1 ножка_59 зеленый светодиод порт "д"12   (PD12)
// или тим_4 ченнел_2 ножка_60 оранжевый светодиод,  порт "Д"13 (PD13)
// или тим_4 ченнел_3 ножка_61 красный светодиод, порт"Д"14 (PD14)
// или тим_4 ченнел_4 ножка_62 голубой светодиод, порт"Д"15 (PD15)

//***************************************************************************************************
//***************************************************************************************************
// Подключаем заголовки
//***************************************************************************************************

#include <stm32f4xx.h>
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_rcc.h>
#include <stm32f4xx_tim.h>
#include <stm32f4xx_exti.h>
#include <misc.h>
#include <stm32f4xx_syscfg.h>

#define HSE_VALUE ((unit32_t)8000)    // кварц установлен на 8МГц

int main(void)
{

SystemInit() ;    //настройка тактирования

//***************************************************************************************************
//***************************************************************************************************
// включаем тактирования

// включаем тактирование порта

// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
RCC->AHB1ENR |= 0b00000000000000000000000000001000; // (тактируется от 168 МГц)

//---------------------------------------------------------------------------------------------------

// включаем тактирование таймера_4

// RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE)
// RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
RCC->APB1ENR |= 0b00000000000000000000000000000100; // (тактируется от 42 МГц)
//---------------------------------------------------------------------------------------------------

//***************************************************************************************************
//***************************************************************************************************
// Настраиваем порты

GPIOD->MODER = 0b10101010000000000000000000000000;  // альтернативная функция на 15,14,13,12 пинах ( передаем управление ножками альтернативной функции )
GPIOD->OTYPER = 0b00000000000000000000000000000000;  // Двухтактный выход на 15,14,13,12 пинах и на остальных
GPIOD->OSPEEDR = 0b11111111000000000000000000000000;  // Скорость высокая на 15,14,13,12 пинах
GPIOD->PUPDR = 0b00000000000000000000000000000000;  // Без подтяжки

// включаем альтернативную функцию
// Номер альтернативной функции =2

//GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);
//GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);
//GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4);
//GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_TIM4);

GPIOD->AFR[1] |= 0b00100010001000100000000000000000;

//***************************************************************************************************
//***************************************************************************************************
// Настраиваем таймер

// TIM4->CCER |= (TIM_CCER_CC1E|TIM_CCER_CC2E|TIM_CCER_CC3E|TIM_CCER_CC4E);
TIM4->CCER |= 0b0001000100010001;    // каналы СС1, CC2, CC3 и CC4 настроены как выход, по этому устанавливая единицу мы подключаем их к соответствующей ножке МК
          //включаем каналы таймера как выходы ( подключаем их к ножкам )

//---------------------------------------------------------------------------------------------------

// TIM4->CCMR1|=(TIM_CCMR1_OC1M_0|TIM_CCMR1_OC1M_1|TIM_CCMR1_OC1M_2|TIM_CCMR1_OC2M_0|TIM_CCMR1_OC2M_1|TIM_CCMR1_OC2M_2);
// TIM4->CCMR2|=(TIM_CCMR2_OC3M_0|TIM_CCMR2_OC3M_1|TIM_CCMR2_OC3M_2|TIM_CCMR2_OC4M_0|TIM_CCMR2_OC4M_1|TIM_CCMR2_OC4M_2);
TIM4->CCMR1 |= 0b0110000001100000;    // прямой шим на 1 и 2 канале таймера
TIM4->CCMR2 |= 0b0110000001100000;    // прямой шим на 3 и 4 канале таймера

//---------------------------------------------------------------------------------------------------

  TIM4->PSC = 42-1;      // ( предделитель = 42 ) таймер работает на частоте 1 МГц
// TIM4->PSC = 0b0000000000101001;  // предделитель частоты таймера 42-1

//---------------------------------------------------------------------------------------------------

// TIM4->CNT = 0b0000000000000000;    // регистр сравнения таймера... -> обнуляем таймер

//---------------------------------------------------------------------------------------------------

TIM4->ARR = 0b0100111000100000;  // число до которого тикает таймер ( частота ШИМа ) - по умолчанию тикает до FFFF

// частота 42 МГц,
// предделитель таймера = 42  - значит частота таймера = 1МГц ( периуд = 0,000001 сек )
// Частота ШИМа для сервопривода = 50 ГЦ ( периуд 0,02 сек ) значит таймер будет тикать 20000 раз ( 0x4E20 = 0b0100111000100000 )

//---------------------------------------------------------------------------------------------------

// TIM4->CR1 |= TIM_CR1_CEN;
TIM4->CR1 |= 0b0000000000000001;    // пуск таймера ( таймер начал считать )

//---------------------------------------------------------------------------------------------------

TIM4->CCR1 = 0b0000010111011100;  // зеленый. первый канал ШИМа - длина импульса = среднее положение ( крайнее левое положение 0000001111101000 ) ( крайнее правое положение 0000011111010000 )
TIM4->CCR2 = 0b0000001111101000; // оранжевый. второй канал ШИМа - длина импульса  
TIM4->CCR3 = 0b0000011111010000; // красный. третий канал ШИМа - длина импульса  
TIM4->CCR4 = 0b0100111000100000;  // голубой. четвертый канал ШИМа - длина импульса ( максимум 0b0100111000100000 )

//---------------------------------------------------------------------------------------------------
}



не успеваю за своими мыслями......
 
ВитГоДата: Понедельник, 09.06.2014, 05:22 | Сообщение # 83
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
у тебя же был осциллограф из звуковой карты.. снимал осциллограммы сигналов ?

Виталий (аka ВитГо)
 
uwrteyДата: Вторник, 10.06.2014, 01:18 | Сообщение # 84
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
Осциллограф есть и по сей день.
Но осциллограммы я не снимал - попробую сегодня вечером после работы это сделать.
Я думаю, что если и есть ошибка, то она связана с неправильной частотой ШИМа или неправильной длиной импульса...
А так-то ШИМ вполне работоспособный - я ведь без всяких проблем регулирую яркость светодиода....

Но все же я больше склоняюсь к тому что мой драйвер управления сервой сделан не правильно.. ( 3,3 вольта не достаточно для полного открытия полевика )

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


Добавлено (09.06.2014, 23:02)
---------------------------------------------
Странно на осциллограмме ( осциллограф с закрытым входом ) только включение и выключение..
Как будто я подключаю к источнику постоянного напряжения... Может частота высокая очень..

кстати, что ты мне по осциллографу скажешь ? http://vg.ucoz.ru/forum/19-252-1

Добавлено (10.06.2014, 01:18)
---------------------------------------------
Я решил пойти другим путем ( хитрым )
На отладочной плате есть светодиоды, при чем на тех же ножках, которые я к серве подключаю, а значит я могу настроить таймер так что бы оценить мигание светодиодов.
Я решил настроить ШИМ на частоту 1Гц с длительностью импульса 0,5 сек ( длительность паузы естественно такая же )
И на мое удивление за 5 реальных секунд я насчитываю 6-7 миганий... как так ?

настройки такие:
Частота шины APB1 = 42 МГц
Предделитель таймера = 4200 ( Значит частота таймера = 0,01 МГц ( 10 Кило Герц )
частота ШИМа = 1Гц - То-есть таймеру нужно тикнуть 10000 раз.
гружу в ARR число 10000 (0x2710)
а длительность импульса я указываю 0,5 секунды (0x1388)...
Вроде все правильно - днем попрошу помощи в подсчете импульсов у жены...( возможно просчитался )

***

Кстати, а не инверсный ли ШИМ я задал? dry
Код

TIM4->CCMR1 |= 0b0110000001100000;    // прямой шим на 1 и 2 канале таймера
TIM4->CCMR2 |= 0b0110000001100000;    // прямой шим на 3 и 4 канале таймера

чем, в таком случае, управляет число загруженное в CCRn ( где n номер канала ) импульсом или паузой ?
Ах, ну да... вопрос снят... Чем больше число - тем ярче светодиод - значит импульсом.. - все правильно - ШИМ = прямой!
Прикрепления: 9522250.jpg (24.7 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Вторник, 10.06.2014, 01:23
 
ВитГоДата: Вторник, 10.06.2014, 05:38 | Сообщение # 85
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
предделитель сделай 42
и получишь один тик таймера = 1 мкс


Виталий (аka ВитГо)
 
uwrteyДата: Вторник, 10.06.2014, 21:59 | Сообщение # 86
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
Ну когда я шим для сервы делал ( код выше ) именно так и сделал ( предделитель 42 )..
Я решил сделать мигание светодиода каждую секунду... По этому и сделал такое извращение...

Добавлено (10.06.2014, 21:59)
---------------------------------------------
Только-что посчитал количество миганий за 10 секунд - и оно равно 20, то-есть в два раза больше нужного.
Разбираюсь....


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Вторник, 10.06.2014, 17:02
 
uwrteyДата: Вторник, 10.06.2014, 22:25 | Сообщение # 87
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
Вот в чем дело! Там еще какой-то умножитель есть

Виталий, расскажи пожалуйста что за умножитель там такой?

******************************

П.С.
1) я заставил мигать светодиод каждую секунду.
2) шим для сервы так и не запустил... не пойму в чем дело..
Прикрепления: 9444438.jpg (200.1 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Вторник, 10.06.2014, 23:30
 
ВитГоДата: Вторник, 10.06.2014, 23:28 | Сообщение # 88
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
а светодиод с какими параметрами запустил ? (чтобы каждую секунду мигал)

нет вроде там больше никакого умножителя, смотри настройки таймера в RM0090 - там все описано....


Виталий (аka ВитГо)
 
uwrteyДата: Вторник, 10.06.2014, 23:34 | Сообщение # 89
Генерал-майор
Группа: Администраторы
Сообщений: 3300
Репутация: 11
Статус: Offline
предделитель = 8400 ( получил частоту 0,01 МГц = 10000Гц )
число до которого тикает таймер = 10000 ( частота мигания 1 Гц )
длина импульса = 2500 ( 0,25 сек )

как нет умножителя ?
а это что тогда?

Там же написано: "Если AHB-предделитель равен единице, то умножитель равен единице, иначе умножитель равен двум"
В моем случае AHB-прескалер не равен единице, и это значит, что умножитель равен двум...

О-о - я что-то начал понимать? cool
Прикрепления: 5231647.jpg (140.4 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Вторник, 10.06.2014, 23:47
 
ВитГоДата: Среда, 11.06.2014, 05:58 | Сообщение # 90
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
ааа, ну значит так фиксированный множитель.. но настроек там нет...

Виталий (аka ВитГо)
 
Поиск:


Copyright MyCorp © 2024
Сделать бесплатный сайт с uCoz