Свежие обсуждения
Микроконтроллеры

ШИМ регулятор оборотов для колекторника

1 9 10

Neman2000: Спасибо но это совсем не то!
Спецы помогут конечно, но пока вот что (ИМХО конечно): разбей свою задачу на подзадачи попроще, например на:

1. замер вх. импульса;
2. выдача шима.

Вот для ШИМа в ещё в лучшем качестве (в pdf). Там, в примерах 11-13, считай алгоритм твоего регулятора, схема включения и расчёты. Можно от этого и оттолкнуться, как ты хотел. Код это вторично уже, когда поймёшь в деталях что тебе именно надо. Всё под PIC рассказано. Пример 12 как раз для тебя ИМХО. В таблице к примеру 12 те режимы что ты бы и хотел я думаю расписаны. Понимаешь хоть под Atmel хоть под Microchip, а принципы остаются одними и теми же. Ну вроде всё, что хотел сказать. Удачи.

188462.zip

 

Насчёт измерения импульсов (на примере AVR), для PIC по аналогии:

У МК AVR есть входы INT - входы внешних прерываний. Т.е. по внешнему фронту или спаду (по чём срабатывать выбирается программистом) внешнего сигнала вырабатывается прерывание.

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

Например запустить тот или иной таймер считать в течение определённого времени и сохранить насчитанное значение в переменной для дальнейшей обработки, и т.о. измерить входной импульс можно. Это самое простое что приходит в голову для твоего случая. Остальное - это детали, т.е. зависит от конкретного МК. Ну дальше не знаю, сам ещё такие штуки не делал за ненадобностью (пока ).

 

Спасибо,но нето опять,этож аппаратный ШИМ,а мне надо програмный применительно к пику12ф629 или 675,
и в приведенном мануале все както по турецки обьясняется.
Попробую обьяснить что надо:
В пике есть TMR0 и с помощью него как я понимаю будет проводиться замер длины входного сигналла (понять как это делается???и код.......)
одновременно так же с помощью TMR0 выходит величина ШИМа(понять как это делается???и код.......)
Как вообще в TMR0 число записать чтоб тик был не от нуля?
И вообще попростому бы кто пжлст обьяснил алгоритм,
непойму с шимом и замером

 

Мне гдето надо ШИМа ступенек 20 ,ну а если больше будет думаю лучше так как плавней будет работа газа.
Скриншет попонятней прикрепляю

 

Neman2000: ...а мне надо програмный применительно к пику12ф629 или 675
Ааа, тогда понятно, извини что не понял сразу, то-то мне листинг твоего первого графа заморочным показался

Но ведь ты постил раньше

Neman2000: ...а я хочу сам научиться делать программу

Ну вот смотри, "делать программу" примерно так:
1. придумать, нарисовать принципиальную схему, исходя из нужной функциональности.
2. определить алгоритм работы устройства.
3. выбрать среду проектирования, исходя из своей подготовки и сложности проекта.
4. определиться с доступностью комплектации.
5. выбрать, учитывая пп. 1-4 и, возможно, какие-то особые требования к устройству, микроконтроллер (МК).
6. собственно начать программирование, обращаясь к п.1,2 и 5.
7. корректировка и т.п.

Так поясни, почему ты выбрал МК без возможности аппаратного ШИМа и с мелкой памятью?

Ведь начинающему аппаратный ШИМ поднять в разы проще будет (опять же см. pdf-мануал). А МК с мелкой памятью, без особого искусства программирования на Си тяжеловато применить будет, память может кончиться быстрее, чем прогу напишешь.

Помню как-то испугался после компиляции, с чего это вдруг занятая память стала аж 36%, ведь проги то всего ничего было. Оказалось по ошибке в свойствах проекта младший МК указал .

 

Записываю конфигу согласно даташиту,далее 7пин на выход(static bit trisLED @ (unsigned)&TRISIO*8+0 ;)и(static bit LED @ (unsigned)&GPIO*8+0 ;),копирую обращение с хидера.
Для пика16ф628 без ошибок компилируется,а дляпика12ф629 с ошибками?
Хотя конфигу сто раз проверил и регистры ввод-вывода с хидера беру!

______________________________________________________________________________________________________________________
// Шаблон программы управления роботом для компилятора Hi Tech PIC Lite.
// Таймер установлен на срабатывание каждые 1024 мкс.

#include <pic.h>
__CONFIG(0x00FE4); //Конфигурация РIСI2F629:
//тактовый генератор внутренний,
// используется внтренний сигналл сброса,
//таймер РWRТ включен,
//сторожевой таймер выключен,
//защита кода отключена,
// детектор падения напряжения включен,

//########################### Глобальные переменные:#######################################

char PWMCycle; // Счетчик циклов от 0 до 29
char PWMDuty; // Длительность импульса
volatile int PWMLoop; // Счетчик периодов ШИМ сигналла

static bit trisLED @ (unsigned)&TRISIO*8+0 ; // Ошибка192 строка 25

static bit LED @ (unsigned)&GPIO*8+0 ; // Ошибка192 строка 26

const int LEDon = 0; // Выключить светодиод
const int LEDoff = 1; // Включить светодиод

//************************ Обработчик прерываний от таймера:********************************
void interrupt tmr0_int(void)
{
if (T0IF) { // Если запрос на прерывание поступил от таймера ТМR0,
T0IF = 0; // то сбросить флаг прерывания

//*****Здесь можно описать дополнительные действия для обработки прерываний от таймера*****
//
switch(PWMDuty) { // Проверить на крайние значения
case 0: // Если задана нулевая ширина импульсов
LED = LEDoff; // То держать низкий уровень
break;
case 55: //Если ширина импульсов равна периоду
LED = LEDon; // То держать высокий уровень
break;
default: //В противном случае
// Если значение счетчика циклов меньше заданной ширины импульса
if (PWMCycle = PWMDuty)
LED = LEDon; // то держать высокий уровень
else // Впротивном случае низкий уровень
LED = LEDoff;
} // Конец оператора switch
if (++PWMCycle ==55) {; //
PWMCycle =0;
}
} // endif
//************** Здесь можно разместить код для установки других прерываний*****************
} // Конец обработчика прерываний.

//################################## СЛУЖЕБНАЯ ПРОГРАММА ###################################
void enableLED(int LEDstate) // Установить состояние светодиода
{ //В соответствие со значением LEDstate
LED = LEDoff; // Сначала светодиод негорит
if (LEDstate) {
PWMCycle = 0; // Обнулить счетчик циклов
PWMDuty = 30; // Сначала ширина импульсов равна периоду
PWMLoop = 0; // Счетчик периодов равен 0
trisLED = 0; // Вывод управления светодиодом переводим в режим выходного
} else
trisLED = 1; // Вывод управления светодиодом переводим в режим входного
//Светодиод потушен
} //Конец служебной программы
//############################# ГЛАВНАЯ ПРОГРАММА: ########################################
void main(void)
{

OPTION = 0x0D0; // использовать предделитель совместно
// с таймером ТМR0, коэффициент деления 4.
TMR0 = 0; // Начальный сброс таймера TMR0
T0IE = 1; // Разрешить прерывания от таймера.
GIE = 1; // Разрешить обработку прерываний.

//*********** Здесь надо выполнить инипиализапию периферийных устройств.*******************
enableLED(1); //Включить светодиод и выполнить инициализацию параметров

while (1==1) { // Бесконечный цикл.
//**************** Здесь надо разместить код для реализации *******************************
// Алгоритм измененияширины импульсов во времени
if (PWMLoop == 2) { // Каждые две секунды
if (PWMDuty == 0)
PWMDuty = 55; //Максимальная ширина импульсов
else

PWMLoop = 0; // Сбросить счетчик периодов
} // endif
} // endwhile Конец оператора while.
} // End of Mainline Конец главной программы.

___________________________________________________________________________________________
РЕЗУЛЬТАТ КОМПИЛЯЦИИ

Очистка: Удаляю промежуточные и выходные файлы.
Очистка: удалён файл "E:\test\test.cce".
Очистка: готово.
Выполнение: "C:\Program Files\HI-технический-колледж Software\PICC\9.50\BIN\PICC.EXE"-C-E "test.cce" "test.c"-O "test.obj"-Zg9-O-ASMLIST-Q-MPLAB-16F627
Консультация [1207]: некоторые из вариантов командной строки, которые Вы используете, являются теперь устаревшими
Консультация [1208]: использование - помогает опции или обращается(относится) к пользовательскому руководству для подробностей опции
Ошибка [192] E:\test\test.строка 25: неопределенный идентификатор "TRISIO"
Ошибка [236] E:\test\test.cтрока 25: простое целочисленное требуемое выражение
Ошибка [192] E:\test\test.строка 26: неопределенный идентификатор "GPIO"
Ошибка [236] E:\test\test.строка 26: простое целочисленное требуемое выражение
Останов основывается на первом отказе(неудаче) как требуется.
КОМПОНОВКА ТЕРПЕЛА НЕУДАЧУ: пятница 20 февраля 10:44:07 2009
_______________________________________________________________________________________________________________________
Помогайте пжлст.

 

Neman2000: ASMLIST-Q-MPLAB-16F627

А тут (строка "выполнение" - опции команды PICC.EXE) почему PIC16А627 указан, а не РIСI2F629 как в начале программы?

 

Спасибо Digital,поставил в MPLAB РIСI2F629 и компиляция прошла успешно,
_____________________________________________________________________________________________

РЕЗУЛЬТАТ КОМПИЛЯЦИИ
--------------------------------------------
Очистка: Удаляю промежуточные и выходные файлы.
Очистка: удалён файл "E:\test\test.cce".
Очистка: готово.
Выполнение: "C:\Program Files\HI-технический-колледж Software\PICC\9.50\BIN\PICC.EXE"-C-E "test.cce" "test.c"-O "test.obj"-Zg9-O-ASMLIST-Q-MPLAB-12F629
Консультация [1207]: некоторые из вариантов командной строки, которые Вы используете, являются теперь устаревшими
Консультация [1208]: использование - помогает опции или обращается(относится) к пользовательскому руководству для подробностей опции
Выполнение: "C:\Program Files\HI-технический-колледж Software\PICC\9.50\BIN\PICC.EXE"-E "test.lde" "E:\test\test.obj"-M "test.map"-O "test.cof"-O "test.hex"-Q-MPLAB-12F629
Консультация [1207]: некоторые из вариантов командной строки, которые Вы используете, являются теперь устаревшими
Консультация [1208]: использование - помогает опции или обращается(относится) к пользовательскому руководству для подробностей опции

Карта Использования Памяти:

Пространство(Пробел) программы:
ЗАКОДИРУЙТЕ использовал 60-ый (96) из 3FFh слова (9.4 %)
Используемая КОНСТАНТА 6h (6) из 3FFh слова (0.6 %)
ВХОД использовал 0h (0) из 3FFh слова (0.0 %)
СТРОКА использовала 0h (0) из 3FFh слова (0.0 %)

Пространство(Пробел) данных:
BANK0 используемый 8h (8) из 40-ых байтов (12.5 %)
COMBANK использовал 0h (0) из 40-ых байтов (0.0 %)

Пространство(Пробел) СППЗУ:
EEDATA использовал 0h (0) из 80-ых байтов (0.0 %)

Идентификатор пространство(пробел) Местоположения:
IDLOC использовал 0h (0) из 4h байты (0.0 %)

Биты конфигурации:
Используемая КОНФИГУРАЦИЯ 1h (1) из 1h слово (100.0 %)

Резюме:
Программируйте пространство(пробел), использовал 66-ой (102) из 3FFh слова (10.0 %)
Используемое пространство(пробел) данных 8h (8) из 40-ых байтов (12.5 %)
Пространство(Пробел) СППЗУ использовало 0h (0) из 80-ых байтов (0.0 %)
Идентификатор пространство(пробел) Местоположения использовал 0h (0) из 4h байты (0.0 %)
Используемые биты конфигурации 1h (1) из 1h слово (100.0 %)

Загружено E:\test\test.cof.
КОМПОНОВКА ПРЕУСПЕЛА: пятница 20 февраля 11:59:06 2009
----------------------------------------------------------------------------------------------------------------------------------------------------
А биты конфигурации обязательно в MPLAB ставить,или достаточно конфиг Хаитека?(__CONFIG(0x00FE4); //Конфигурация РIСI2F629

 

Neman2000: А биты конфигурации обязательно в MPLAB ставить,или достаточно конфиг Хаитека?(__CONFIG(0x00FE4); //Конфигурация РIСI2F629

Точно не подскажу, т.к. не устанавливал такую связку программ. Но можно предположить, что для получения прошивки аналогичной результату в симуляторе MPLAB биты конфигурации лучше выставить одинаковыми и там и там.

 

И ещё... Нижний график (графы.gif (35 КБ, 1772×1004)) это я так понял - скважность ШИМ, а не её величина, поэтому-то, где паузы длиннее, там постоянное эквивалентное напряжение больше. Но понятнее было бы для себя перерисовать наверное, ШИМ по величине, т.е. там где паузы короче - газ больше (инвертировать граф т.е.). У тебя график сразу таких вопросов не вызвал, т.к. вроде бы привычнее считать когда пауза длиннее, то и Uэквив. пост.<=>"газ" меньше?