Создание собственной системы стабилизации
У меня произошли некоторые изменения, в частности поменял входы и выходы:
Входы:
1 PE9 TIM1_CH1
2 PE11 TIM1_CH2
3 PE13 TIM1_CH3
4 PE14 TIM1_CH4
5 PD12 TIM4_CH1
6 PD13 TIM4_CH2
7 PD14 TIM4_CH3
8 PD15 TIM4_CH4
Выходы:
1 PA0 TIM2_CH1
2 PA1 TIM2_CH2
3 PA2 TIM2_CH3
4 PA3 TIM2_CH4
5 PB0 TIM3_CH3
6 PB1 TIM3_CH4
7 PC6 TIM8_CH1
8 PC7 TIM8_CH2
К сожалению CH3 и CH4 восьмого таймера заняты аппаратно MicroSD - надо было хотя-бы 144 ноговый проц хапнуть - тогда бы было всё в шоколаде, дело в том что 1й и 8й таймеры для аппаратного ШИМ.
Прошу критики…
Схема нижней платы пока выглядит как-то так:
К сожалению CH3 и CH4 восьмого таймера заняты аппаратно MicroSD - надо было хотя-бы 144 ноговый проц хапнуть - тогда бы было всё в шоколаде, дело в том что 1й и 8й таймеры для аппаратного ШИМ. Прошу критики…
Думаю проц надо 144 ноги, ибо его потенциальные возможности по колчеству памяти не возможно реализовать из-за нехватки ног для доп. датчиков и приводов).
Сергей, может МС как нибудь подписать, я ДД4 не узнал (( и непонятна роль вентеля ДД6.
И по USB неуверен, но у F4 вроде должна быть внутренняя подтяжка линий, и дополнительная линия VBUS приходит на PB9.
В остальном вроде всё нормально, и ещё кнопочку для BOOT предусмотри.
Это ж пока набросок, УСБ и вентиль (в крайнем случае можно перемычку вместо него кинуть) - я уже так делал (подсмотрел в СС), всё работает на ура, DD4 - барометр (ну нарисовал я его так) и вообще ещё много не дорисовано тот же CS у барометра, для BOOT будут переключатели, так же отказался от подсветки - делаю 4 входа АЦП на отдельный разъём ну и АЦП для батарейки, я пока заострил внимание на ШИМах - остальное в процессе, главное сейчас успеть барометр купить, а то их осталось 152шт. 😦 …
Может, MicroSD по SPI засандалить? освобожу 8-й таймер, шимы аппаратные можно сделать…
Может, MicroSD по SPI засандалить? освобожу 8-й таймер, шимы аппаратные можно сделать…
Юзал SD по SPI все работает как часики.
Значит пошол я переделывать…
Схема приобретает какой-то устрашающий вид:
Куда сонар повесить?
Странно, на гудлаке ордер висит как неоплаченный, а палка сказала что платёж прошел, или это нормально - просто подождать надо?
на гудлаке ордер висит как неоплаченный, а палка сказала что платёж прошел, или это нормально - просто подождать надо?
Написать в ГЛБ, указать номер ИД оплаты с палки. А то они часто не видят.
Спустя почти сутки всё пошло 😃
Куда сонар повесить?
Вход с сонара надо весить туда, где внешние прерывания легко размещаются, рядом с линиями прерывания по готовности МПУ, выход на запуск любой свободный (выбирай по остаточному принципу).
Сергей, я не изучал еще переферию Ф4, там возможно более гибкое назначение внешних прерываний, а у 103го вся наружа на одном порту, если склероз не изменяет.
Вот наврал, всё достаточно гибко, главное для нескольких прирываний не выбирать одну и ту же линию разных портов. Типа если для ДУС выбран PB10, то нельзя для компаса брать PA10 или PC10.
😃 Специально для Леонида (leprud) и товарищей из этой- rcopen.com/forum/f134/topic291488 ветки, DCMI организуется, с малыми потерями даже при нынешней схеме (перенос на другие лапы светодиодов, GPS и всяких мелочей, типа CS и сонара) но разводить его как-то нет желания, но чешется зараза 😃
Ну наконец-то маленькая обзавелась новым барометром - теперь рабочим 😃
Чёт меня попёрло, сделал шнурок для сонара, если удастся перенести серву, то 5-й 6-й выходы будут использованы для сонара. И тут-же в догонку мысль пришла, i2c то у меня выведен разъём может и GPS замутить платку на 168 меге - аля ардуино или не надо (модуль один для большого) - это всё про мелкую…
GPS замутить платку на 168 меге
Это нафига? мегу не надо приплетать, СТМ сам может НМЕА спокойно в фоне разобрать, огород городить незачем.
Сергей, покажи, что получилось
Это если для мелкой - там всё занято и код готовый есть с мультивия…
с сонаром пока не справился, пока не смог перенести серву, копаюсь в драйвере сонара, вот как выглядит драйвер code.google.com/p/afrodevices/…/drv_hcsr04.c
PB9 - занят сервой, но есть свободный PA10 чешу репу…
Большую ещё не дорисовал, питания и дребедень разную типа BOOT
ошибся PA8
А для каких целей стоит EEPROM? Для настроек или логов? Если логов, может лучше использовать с SPI интерфейсом?
Либо для настроек, либо для записи вейпоинтов, по SPI флешка мелкая висит - этож я себе гемо забавку на всю зиму готовлю 😃
Ха-ха-ха, сонар не работает на портах PB8 - PB9, точнее запускается, но прерывания не ловятся, а только на PB0 PB1, у меня есть пару свободных портов, но стоит ли, всё равно он в иму не участвует…
Алексей Sir Alex в пирате есть сонар, в какой он стадии, стоит с ним возится (имеется ввиду мелкая плата)…
могу поделиться
Ну поделитесь, если не жалко, повоюю 😃
Появилась идея, чтобы запустить GPS через UART надобно наверно PPM Summ собрать на атмеге , только маааленький - чтобы влез к приёмнику турниговскому в коробку (нету пока золотого запаса купить нормальный)?
Алексей Sir Alex в пирате есть сонар, в какой он стадии, стоит с ним возится (имеется ввиду мелкая плата)…
Сонар я почти год назад довел до ума. Правда не знаю, работает ли он на последних прошивках - не проверял.
Ну поделитесь, если не жалко, повоюю
сорри что чисто кодом:
void incError() {
if(sonarErrors < SONAR_ERROR_MAX) sonarErrors++;
}
void decError(uint8_t limit) {
if(sonarErrors > limit) sonarErrors–;
else sonarErrors = limit;
}
ISR(PORTF_INT0_vect)
{
uint16_t cTime;
static uint16_t edgeTime;
uint8_t pin;
pin = PORTF.IN;
cTime = micros();
sei(); // re-enable interrupts
if(pin & SONAR_READ_MASK) {
edgeTime = cTime;
} else {
#ifdef SONAR_DEBUG
debug[2] = millis() - startTime; // debug measure time to GUI
#endif
sonarData = cTime-edgeTime;
state = 2; // finished measure
//debug[2]=sonarData;
}
}
// Trigger sonar measure and calculate distance
void Sonar_update() {
uint16_t curTime = millis();
uint16_t dTime = curTime - startTime;
// If we are waiting too long, finish waiting and increase error counter
if(dTime > SONAR_MAX_TIME) {
incError();
state = 0;
}
else if(state == 2) { // Measure finished
if(dTime > SONAR_ERROR_TIME) { // wrong time, it should be error!
incError();
state = 0;
} else if(dTime > SONAR_WAIT_TIME) {
uint16_t dist = sonarData/58;
if ((dist < SONAR_MAX_DISTANCE)&(dist > SONAR_MIN_DISTANCE)) { // valid data received
sonarAlt = dist;
decError(0);
} else { incError();}
state = 0; // ready for next measure
}
}
// Start new measure
if(state == 0) {
PORT_SetPins(&PORTF,SONAR_PING);
startTime = curTime;
state = 1;
delayMicroseconds(10);
PORT_ClearPins(&PORTF,SONAR_PING);
}
#ifdef SONAR_DEBUG
debug[0] = sonarAlt;
debug[1] = sonarErrors;
#endif
if (sonarErrors>8) {sonarTrue=0;}
else if (sonarErrors==0) {sonarTrue=1;}
}
итого >8 ошибок = ошибка сонара, снизилось до 0 - все гуд, можно сделать и поменьше