PORTDLC = PORTDLC|0x04; /*установить E в 1 */
PORTDLC = 0x00; /* установить E и RS в 0 */
delay_100us();
delay_100us();
}
/********************************************************************/
/* delay_5ms: программная задержка 5 мс */
/********************************************************************/
void delay_5ms(void) {
int i;
for (i=0; i<50; i++) {
delay_100us();
}
}
/********************************************************************/
/* delay_100us:программная задержка в 100 мс */
/********************************************************************/
void delay_100us(void) {
int i;
for(i=0; i<800; i++) {
asm("nop");/*выполнение команды nор ассемблера занимает 1 период*/
}
}
/********************************************************************/
/* display_count_LCD: преобразует целое число в ASCII символ */
/* для вывода на ЖКИ */
/********************************************************************/
void display_count_LCD(unsigned int count) {
unsigned int thousands_int;
unsigned int hundreds_int;
unsigned int tens_int;
unsigned int ones_int;
char thousands;
char hundreds;
char tens;
char ones;
/*выбирает и преобразует наибольшую значащую цифру в десятичное */
/* значение + 48, образуя ASCII код */
thousands_int = count/1000;
thousands = (char)(thousands_int + 48);
/*выбирает и преобразует следующую наибольшую значащую цифру */
/* в десятичное значение + 48, образуя ASCII код */
hundreds_int = (count - thousands_int*1000)/100;
hundreds = (char)(hundreds_int + 48);
/*выбирает и преобразует следующую наибольшую значащую цифру */
/* в десятичное значение + 48, образуя ASCII код */
tens_int = (count - thousands_int*10 0 0 - hundreds_int*100)/10;
tens = (char)(hundreds_int + 48);
/*выбирает и преобразует следующую наибольшую значащую цифру */
/* в десятичное значение + 48, образуя ASCII код */
ones_int = (count-thousands_int*1000-hundreds_int*100-tens_int*10);
ones = (char)(ones_int + 48);
/*выводит результат на ЖКИ*/
putcommands(0x80); /*курсор ЖКИ переводится на строку 1, позицию 1*/
putchars(thousands);
putchars(hundreds);
putchars(tens);
putchars(ones);
}
/********************************************************************/
/********************************************************************/
В предыдущем разделе мы рассказали, как измерить скорость вращения двигателя и отобразить ее в оборотах в минуту. В этом разделе мы замкнем контур обратной связи. Для этого мы сравним мгновенную скорость вращения с опорным значением, чтобы затем скорректировать коэффициент заполнения ШИМ и стабилизировать скорость вращения двигателя на желательном уровне при изменении нагрузки двигателя.
Стабилизируем скорость двигателя на уровне 1600 об/мин. Чтобы сделать это, мы должны определить требуемый коэффициент заполнения ШИМ для 1600 об/мин. Из полученного нами графика (рис. 7.17) мы видим, что для обеспечения скорости вращения приблизительно в 1600 об/мин, необходимо подать на двигатель напряжение в 8 В. При питании двигателя от источника в 12 В соответствующий коэффициент заполнения ШИМ составит 66.7 % (8 В/ 12 В).
Чтобы достичь коэффициента заполнения ШИМ в 66.7%, установим значение периода ШИМ на 256 единиц, а коэффициент заполнения ШИМ на 172 единицы.
Как мы уже указывали при предыдущем обсуждении системы ШИМ, эти значения устанавливаются в регистрах PWPER0 и PWDTY0, соответственно.
Мы используем сигнал управления ШИМ с частотой 976 Гц. Для этого частоту таймера ШИМ, равную 8 МГц, необходимо поделить на 32. При этом мы получим частоту в 250 кГц (период 4 мкс) и используем ее в качестве синхронизирующей для системы ШИМ. Поскольку мы используем период в 256 импульсов, частота управления ШИМ будет равна 976 Гц (период = 4 мкс/импульс×256 импульсов).
Ниже приведен исходный текст программы, позволяющей изменять коэффициент заполнения ШИМ, чтобы стабилизировать скорость на уровне 1600 об/мин.
Эта функция используется начальной установки скорости вращения двигателя.
/********************************************************************/
/*init_PWM(): инициализация модуля ШИМ контроллера 68HC12 */
/********************************************************************/
void init_PWM() {
PWTST = 0x00; /*Установить порт ШИМ в нормальный режим */
PWCTL = 0x00; /*установить режим фронтовой ШИМ */
PWCLK = 0x28; /*без объединения каналов, ECLK/128*/
PWPOL = 0x01; /*активный уровень 1 */
DDRP = 0xFF; /*Порт P конфигурировать как выходной */
PWEN = 0x01; /*установить выход ШИМ */
PWPER0 = 255; /*установить для ШИМ период, соответствующий 976 Гц */
Читать дальше