|
Электроника схемы, устройства, справочники и т.п. |
|
Опции темы | Поиск в этой теме | Опции просмотра |
21.12.2012, 15:26 | #171 |
VIP
Регистрация: 22.06.2011
Адрес: 123
Сообщений: 19
Вес репутации: 0 |
Спасибо на счет таймера.
Сегодня почитал, что еще можно использовать асинхронный таймер с часовым кварцем. Таймер тоже будет переполняться каждую секунду, не зависимо от частоты основного кварца процессора. Пока вот, что есть (во вложении исходник на BASCOM-е и проект в Proteus). Алгоритм следит за изменением длительности импульсов на одной из фаз и изменяет скважность общего ШИМ-а, который я дальше пытаюсь раскидать на аккумулятор, на потребители и балласт. Дмаю, что было-бы правильным производить вычисление и распределение ШИМ-ов не выходя из прерывания определения длительности импульса. '********Акселерометр и задача длительности импульса общего ШИМ **************** If U_r_gen < 10 Then Pwm_main = 0 Else If Period <= Period_old Then If Pwm_main < 255 Then Incr Pwm_main Else If Pwm_main > 0 Then Decr Pwm_main End If End If '************************Подпрограмма общета ШИМ-ов***************************** I_set_and_nagruzka = I_set_akb + I_r_nagruzka If U_r_akb > U_set_akb Then If Pwm_ball < Pwm_main Then Incr Pwm_ball End If If U_r_akb <= U_set_akb And I_r_akb > I_set_and_nagruzka Then If Pwm_ball < Pwm_main Then Incr Pwm_ball End If If U_r_akb <= U_set_akb And I_r_akb <= I_set_and_nagruzka Then If Pwm_ball > 0 Then Decr Pwm_ball End If Pwm_akb_and_nagruzka = Pwm_main - Pwm_ball Pwm0 = Pwm_akb_and_nagruzka Pwm2 = Pwm_ball |
21.12.2012, 15:56 | #172 |
VIP
Регистрация: 16.05.2012
Адрес: Пермь
Сообщений: 641
Вес репутации: 12 |
vitalkalm, если вы и так собираетесь измерять мощность, попробуйте вместо периода сравнивать мощность на нагрузке. Это должно повысить эффектность контроллера.
Только алгоритм немного изменится. Возможны синтаксические ошибки, так этого ЯП я не знаю, но думаю суть понятна. If U_r_gen < 10 Then Pwm_main = 0 Else If Power <= Power_old Then Flag = -Flag End If If (Flag = 1) and(Pwm_main < 255) Then Incr Pwm_main End If If (Flag = -1)and(Pwm_main > 0) Then Decr Pwm_main End If Power - текущая мощность Power_old - мощность, которая была Flag - переменная, которая показывает, что мы делали на предыдущем шаге Общая идея такая. Если наше предыдущее действие(увеличение или уменьшение скважности ШИМ) привело к уменьшению мощности, то делаем противоположное действие, а если мощность увеличилась, то продолжаем делать то, что и делали. Последний раз редактировалось BenGunn; 21.12.2012 в 16:19. |
21.12.2012, 16:16 | #173 | |
VIP
Регистрация: 22.06.2011
Адрес: 123
Сообщений: 19
Вес репутации: 0 |
Цитата:
Можно и ШИМ-ы выражать в зависимости от мощностей, но тоже нужно много умножать, что не желательно делать в середине прерывания. Я на распутье... |
|
21.12.2012, 16:35 | #174 |
VIP
Регистрация: 22.06.2011
Адрес: 123
Сообщений: 19
Вес репутации: 0 |
Вот, переделал на сравнение мощностей. Все красиво, Proteus сильно тормозит при симулировании. Надо смотреть в железе. Пока бьюсь над подсчетом кВт*часов.
Последний раз редактировалось vitalkalm; 21.12.2012 в 17:06. Причина: Перепроверил симуляцию. |
21.12.2012, 17:43 | #176 | |
VIP
Регистрация: 22.06.2011
Адрес: 123
Сообщений: 19
Вес репутации: 0 |
Цитата:
Может подпрограму вычисления мощности тудаже засунуть? Где-то видел способ измерения длительных импульсов без применения таймеров, а то много стоит процессор на прерывании. |
|
21.12.2012, 22:44 | #177 |
Администратор
Регистрация: 25.02.2010
Адрес: Латвия, Сигулда
Сообщений: 820
Вес репутации: 10 |
vitalkalm, на прерывании процессор не стоит. Оно, прерывание, для того и существует, чтобы не тормозить процессор. Весь вопрос в том, как оно использовано. Обработчик прерывания должен быть максимально коротким и не содержать ничего лишнего, кроме измерения длительности. Всё остальное должно делаться за пределами прерывания - все вычисления, изменение длительности ШИМ и т.д. Иначе есть риск превратить МК в улитку. Во время прерывания МК нельзя заставлять ожидать прихода чего-то там.
|
21.12.2012, 23:24 | #178 | |
VIP
Регистрация: 22.06.2011
Адрес: 123
Сообщений: 19
Вес репутации: 0 |
Цитата:
|
|
21.12.2012, 23:46 | #179 |
Администратор
Регистрация: 25.02.2010
Адрес: Латвия, Сигулда
Сообщений: 820
Вес репутации: 10 |
Можно и без прерываний обойтись для измерения длительности. Тогда будет сэкономлен таймер для лишнего канала ШИМ. В Баскоме есть очень удобный оператор для этого дела - "Pulsein". Я им вовсю пользуюсь и скорости проца мне хватает. Я измеряю не весь период, а только его половину. Ещё есть оператор "Bitwait". Для любителей ловли импульса заданной полярности. Вместе они выглядят, например, так:
Dim P As Word ' переменная для длительности импульса Bitwait Pinc.4 , Set 'ждём, пока бит 4 порта С станет 1. Pulsein P , Pinc , 4 , 1 'длительность импульса фронт - спад Очень рекомендую снабжать текст программы подробными комментариями. Это очень пригодится в дальнейшем. И это является хорошим тоном в программировании. Кто-то из великих мира компьютеров когда-то давно сказал так: "Отсутствие комментариев в программе является достаточным основанием для увольнения программиста." |
22.12.2012, 00:26 | #180 | |
VIP
Регистрация: 22.06.2011
Адрес: 123
Сообщений: 19
Вес репутации: 0 |
Цитата:
|
|