Дмитрий Вас Опубликовано 18 сентября, 2020 Поделиться Опубликовано 18 сентября, 2020 повторяю вопрос, может кто подскажет? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dasZebra Опубликовано 18 сентября, 2020 Поделиться Опубликовано 18 сентября, 2020 2 минуты назад, Дмитрий Вас сказал: повторяю вопрос, может кто подскажет? А в чем вопрос? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Дмитрий Вас Опубликовано 18 сентября, 2020 Поделиться Опубликовано 18 сентября, 2020 19 минут назад, dasZebra сказал: А в чем вопрос? 05.09.2020 в 17:16, Дмитрий Вас сказал: но мне нужно писать в теле прерывания чтоб был антидребезг и проверка выполнялась только несколько раз в секунду код выше постом. но чтобы отображалось lcd_putstring("stop"); нужно писать в main. как правильно сделать? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
dasZebra Опубликовано 18 сентября, 2020 Поделиться Опубликовано 18 сентября, 2020 Только что, Дмитрий Вас сказал: как правильно сделать? 1. Настраеваете таймер на вызов прерывания например каждые двадцать милисекунд. 2. В прерывании таймера присваеваете глобальной переменной (пусть будет напривер bOneBeat) 1. 3. В функции main в бесконечном цикле опрашиваете состояние этой глобальной переменной, и если она равна 1, то вызываете вашу функцию, в которой выполняете все что вам нужно: антидребезг и проч. 4.После вызова вашей функции не забываете сбросить глобальную переменную в ноль. В своей функции можно задействовать switch и переменную, сохраняющую состояние, и тем самым через заданныц интевал будет ввполняться нужныц код. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Виктор Опубликовано 19 сентября, 2020 Поделиться Опубликовано 19 сентября, 2020 Доброго времени суток, уважаемые форумчане! Увлекаюсь контроллерами в свободное от работы время (хобби так сказать), но хотелось бы заниматься этим делом на более профессиональном уровне. Задался поиском учебного заведения с целью получения профессии в этом направлении. Но понял, что даже не знаю как правильно называется профессия человека, который занимается написанием ПО для микроконтроллеров. Если на форуме есть люди, которые обучаются/обучались/работают в сфере разработки электроники и написания прошивок для МК, подскажите пожалуйста как правильно называется данная специальность? (Программист микроконтроллеров? Наверное нет). Сам когда-то обучался в железнодорожном университете и был у нас один семестр знакомства с PicMicro (Ассемблер). Но по профессии я связист и уровень знаний, который мне дали в универе, совсем никак с МК не связан. С тех пор методом самоучения более-менее усвоил AVR (Ассемблер/C), сейчас вот штудирую STM32 (Ассемблер/С). Заранее спасибо всем, кто отозвался) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 19 сентября, 2020 Поделиться Опубликовано 19 сентября, 2020 18.09.2020 в 18:34, dasZebra сказал: вызываете вашу функцию, в которой выполняете все что вам нужно: антидребезг и проч. вот тут не понял. если эта функция ISR(TIMER1_COMPA_vect) как я ее буду вызывать? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 19 сентября, 2020 Поделиться Опубликовано 19 сентября, 2020 2 часа назад, Гость Виктор сказал: Задался поиском учебного заведения с целью получения профессии в этом направлении. начните с этого https://www.youtube.com/watch?v=qiSjLxeyNv4 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 19 сентября, 2020 Поделиться Опубликовано 19 сентября, 2020 (изменено) 18.09.2020 в 17:46, Дмитрий Вас сказал: может кто подскажет? Вам нужно разделять процесс управления ШИМ-ом и процесс формирования ШИМа. Управление делается в главном цикле, без прерываний (как вариант), генерация же делается по прерываниям. Т.е. главный цикл вторичен, он не мешает формированию ШИМа, потому что может быть прерван в любой момент. Поэтому в главном цикле в можете прекрасно использовать любые "медленные" функции вроде printf, делать сколь угодно долгие "тупые задержки" (в циклах) и вообще тратить ресурсы, как угодно. // где-то у вас есть код, где по прерываниям от таймера делаются выборки из массива синусов для управления ШИМ-ом // а здесь только та часть, которая ШИМ-ом управлеяет. uint8_t get_buton(void){ // в этой функции вы опрашиваете кнопки, давите дребезг // и возвращаете код нажатой кнопки } // а вот так выглядит ваш главный цикл while(1){ switch(get_button()){ case BTN_STOP: // кнопка "стоп" // здесь меняете переменные так, чтобы ШИМ выключился (или как вы там останавливаете) printf("STOP\n"); break; case BTN_FORWARD: // кнопка "вперед" // здесь задаете параметры ШИМа для разгона в одну сторону printf("FORWARD\n"); break; case BTN_REVERSE: // кнопка "назад" // здесь, очевидно, настраиваете ШИМ для вращения в обратную сторону printf("REVERSE\n"); break; } // далее делаете остальное, что надо в главном цикле } Как-то так в общих чертах. И никаких прерваний для кнопок, никаких printf-ов внутри обработчика прерываний, никаких задержек в прерываниях. Да, еще логичнее по кнопкам менять состояния в автомате состояний, если вы понимаете, о чем я, ведь процесс смены направления вращения должен быть растянут во времени... Поэтому логично не просто настраивать ШИМ, а менять его параметры плавно, пока не будет достигнута нужная скорость. Но это уже детали. Изменено 19 сентября, 2020 пользователем ARV 0 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
dasZebra Опубликовано 19 сентября, 2020 Поделиться Опубликовано 19 сентября, 2020 13 часов назад, Дмитрий Вас сказал: вот тут не понял. если эта функция ISR(TIMER1_COMPA_vect) как я ее буду вызывать? #include.... #define... Char bOneBit =0; ISR(TIMER1_COMPA_vect) {bOneBit =1}; //в весторе прерввания больше ничего Void MyVeryImportantFunction(void) { //здесь ваш код чего нужно} void main(void) { // настроечный код таймеров и проч { do while(1) { if(bOneBit) { MyVeryImportantFunction(); bOneBit =0;} } } } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 20 сентября, 2020 Поделиться Опубликовано 20 сентября, 2020 @dasZebra понял , спасибо 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 25 сентября, 2020 Поделиться Опубликовано 25 сентября, 2020 нашел тут платку а на ней мк sc901930fta но дш по нему не смог найти. вот страница https://www.ic-components.com/products/NXP-Semiconductors-Freescale/SC901930FTA.jsp а как дш скачать не пойму. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
my504 Опубликовано 25 сентября, 2020 Поделиться Опубликовано 25 сентября, 2020 3 часа назад, Дмитрий Вас сказал: а на ней мк Откуда уверенность что это МК? Это специализированная микросхема и по ней даташита в открытом доступе никогда не было и не будет, насколько я понимаю. И к тому же она жутко древняя. Примерно 2006 года издания. 0 戦う前に相手のベルトの色に注目 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 30 сентября, 2020 Поделиться Опубликовано 30 сентября, 2020 я тут у себя касячок нашел... выполняться проверка будет по таймеру, но не получится ли что после if((!(PIND&(1<<5)))&&(direction==0)) в котором direction = 1; следующий if ((!(PIND&(1<<5)))&&(direction==1)) тоже будет выполняться if (Flag_Timer1) { //lcd_gotoxy(0,0); //lcd_chisla(AMP0_read(11)); Flag_Timer1 = 0; //---------------------обработка кнопки энкодера----------------------------- if((!(PIND&(1<<5)))&&(direction==0)) { OmegaTe = speed; direction = 1;//ставим в 1 чтобы при следующем нажатии включился реверс //PCTL2 = (1 << PRUN2); lcd_gotoxy(0,0); lcd_putstring("forv"); step++; } if ((!(PIND&(1<<5)))&&(direction==1))//реверс rev { OmegaTe = (~speed) + 1; direction = 0;//сбрасываем в ноль чтобы при повторном нажатии сработал //реверс и начало крутиться в "прямом, forv" направлении lcd_clear(); lcd_gotoxy(0,0); lcd_putstring("rev"); step++; } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
yaroslav.s Опубликовано 30 сентября, 2020 Поделиться Опубликовано 30 сентября, 2020 Будет естественно. Правильнее будет сделать if и при его наступлении сделать case в зависимости от направления движения. 0 Текущий сетап: BBB-AD-H6.1-Nataly2014-AudioPro Ссылка на комментарий Поделиться на другие сайты Поделиться
ARV Опубликовано 30 сентября, 2020 Поделиться Опубликовано 30 сентября, 2020 lcd_clear(), как правило, при очистке дисплея уже ставит курсор в первую позицию первой строки, так что lcd_gotoxy(0, 0) не требуется. 0 Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют... Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 30 сентября, 2020 Поделиться Опубликовано 30 сентября, 2020 я понял всем спасибо 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 30 сентября, 2020 Поделиться Опубликовано 30 сентября, 2020 а еще такой вопрос. из примера кода по AVR495. с оф.сайта вопрос в том что если Omega_ref будет отрицательным if (Flag_IT_timer0) { ADC_start_conv(); Flag_IT_timer0=0; // генерирует шаги задания скорости в программном обеспечении Softcounter += 1 ; if (Softcounter == 2500) { Omega_ref = -400 ; } //-128; } if (Softcounter == 5000) { Omega_ref= -200 ; } if (Softcounter == 7500) { Omega_ref= 200 ; } if (Softcounter == 10000) { Omega_ref= 400 ; Softcounter = 0 ; } } далее по коду Command = Omega_ref ; //команда с сгенерированными шагами и далее: как то странно получается сначало будет вращение в одну сторону, а затем в другую?? if (Command > (S16)(0) ) { direction = 0 ; OmegaTe = Command; } else { direction = 1 ; OmegaTe = (~Command) + 1; } Omega_Te участвует в функции генерирования PWM... и вот здесь direction (направление вращения) // ------------------------ V/f закон -------------------------- amplitude = controlVF(OmegaTe); if (amplitude > MAX_AMPLITUDE) { amplitude = MAX_AMPLITUDE ; } // ------------ - space vector PWN algorithm ----------------- SVPWM(amplitude, OmegaTe) ; // -------- load the PSCs with the new duty cycles ----------- if (direction==0) { PSC_Load (PWM0, PWM0+DeadTime, PWM1, PWM1+DeadTime, PWM2, PWM2+DeadTime); } else { PSC_Load (PWM0, PWM0+DeadTime, PWM2, PWM2+DeadTime, PWM1, PWM1+DeadTime); } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ruhi Опубликовано 1 октября, 2020 Поделиться Опубликовано 1 октября, 2020 (изменено) 18 часов назад, Дмитрий Вас сказал: получается сначало будет вращение в одну сторону, а затем в другую?? Наверно не "затем", а в "зависимости от чего-то", а вот от чего вам и надо понять! и наверно с какой дискретностью, и как это конфигурировать. Если вы сам не разберетесь за вас это никто не с<З>делает (для вашей задачи)! Так что разбирайтесь - у вас нет другого выхода. Изменено 1 октября, 2020 пользователем ruhi 0 Можно сделать все! Но чем больше можно, тем больше нельзя! Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 1 октября, 2020 Поделиться Опубликовано 1 октября, 2020 void s_start(void)//плавный старт { lcd_gotoxy(0,0); lcd_putstring("start"); // подключаем выходы генератора сигнала PSC к выходам порта PSOC0 = (1 << POEN0B) | (1 << POEN0A); PSOC1 = (1 << POEN1B) | (1 << POEN1A); PSOC2 = (1 << POEN2B) | (1 << POEN2A); // генерирует шаги задания скорости в программном обеспечении Softcounter +=1 ; if (Softcounter == 250) { speed = 50 ; } if (Softcounter == 500) { speed = 100 ; } if (Softcounter == 750) { speed = 150 ; } if (Softcounter == 1000) { speed = 200 ; Softcounter = 0 ; } так я и не понял почему с -400 начинается. написал вот так... и работает. теперь проблема if (Flag_IT_timer1) { //lcd_gotoxy(0,0); //lcd_chisla(AMP0_read(11)); Flag_IT_timer1 = 0; //---------------------обработка кнопки энкодера----------------------------- if(!(PIND&(1<<5))) { s_start(); } плавный пуск работает пока держишь кнопку и если долго держать то начинает по кругу. а хотелось бы, просто включились выходы и сработал плавный пуск. так же, плавный стоп и реверс. и все от одной кнопки. короче как начинающему мне очень интересно 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 10 октября, 2020 Поделиться Опубликовано 10 октября, 2020 правильно ли я написал? #define button !(PIND&(1<<5));//кнопка если я не хочу давать какое то значение переменной button_long , а просто если произошло так то то это событие называется так то unsigned char button_time=0; bool button_long; if(button) button_time++; if (button_time>200) { button_time=0; return button_long; } извините что коряво излагаюсь 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dasZebra Опубликовано 10 октября, 2020 Поделиться Опубликовано 10 октября, 2020 (изменено) button_long должно быть проинициированна Изменено 10 октября, 2020 пользователем dasZebra 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
SVovan Опубликовано 13 октября, 2020 Поделиться Опубликовано 13 октября, 2020 Всем доброго времени суток! Выручте пожалуйста форумчане! Микроконтроллер ATmega8, язык С++. Никак немогу получить никакой ШИМ на выводе PB2, а на PB1, все работает без вопросов. В регистре контроля меняю СOM1A0 и COM1A1 на СOM1B0 и COM1B1, но ШИМ не появляется, если активирую два сразу, то на PB1 есть, а на PB2 все равно нет. Может что-то, еще нужно указывать, или в Протеусе есть кокой нибудь нюанс? Реальный контроллер не прошивал, все проверял только в Протеусе. Спасибо 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 19 октября, 2020 Поделиться Опубликовано 19 октября, 2020 (изменено) @SVovan может во втором случае нужно задать OCR1B = 500 Изменено 19 октября, 2020 пользователем Дмитрий Вас 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
SVovan Опубликовано 22 октября, 2020 Поделиться Опубликовано 22 октября, 2020 @Дмитрий Вас, Огромное Вам спасибо, да, нужно было так же дописать значения в регистор OCR1B. Все заработало! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Arb Опубликовано 28 октября, 2020 Поделиться Опубликовано 28 октября, 2020 (изменено) Купил вот такой девайс в описании указано что он подходит для atmega32/16 распиновка у него вот такая Вопрос в том как сюда пристроить atmega32u4 учитывая то что GND звонится со своим собратом напротив, такая же ситуация и с VCC. По пинам atmega32u4 в корпусе qfp44 что то у меня не сходится, получается что замыкаются цифровые контакты как не крути. Подозреваю что просто косяк в пайке или косяк в проектировании платы. Или я чего то не догоняю, прошу помощи у знатоков. распиновка atmega Изменено 28 октября, 2020 пользователем Arb 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.