Технический форум по робототехнике.
Planet001 » 13 май 2014, 18:16
Наконец-то нашел как сделать разрядность ШИМ больше,чем Atmega16 на частоте 25кГц.
Но в Bascom значение менялось на лету.
А тут - нет((.
После задержки в регистр пишется новое значение (в этот момент в порту 0.2 значение 1 для информативности в эмляторе,но Duty Cycle не возрастает:(
Что тут не хватает?
- Код: Выделить всё • Развернуть
#include "lpc21xx.h"
int main(void)
{
/*Assuming that PLL0 has been setup with CCLK = 60Mhz and PCLK also = 60Mhz.*/
/*This is a per the Setup & Init Sequence given in the tutorial*/
int a;
PINSEL0 = (1<<1); // Select PWM1 output for Pin0.0
//T1EMR = (1<<11);
PWMPR = 0; // 1 micro-second resolution
PWMMR0 = 600; // freq (T-period 15 000 000\600)
PWMMR1 = 50; // duty cycle
PWMMCR = (1<<1); // Reset PWMTC on PWMMR0 match
PWMPCR = (1<<9); // enable PWM output
PWMLER = (0<<1); // update MR0 and MR1
PWMTCR = (1<<0)|(1<<3); //ENABLE COUNTER
for (a=1;a<100000;a++)
{}
//PINSEL2 = (0<<2)|(0<<3);
IO0DIR = (1<<2);
IO0SET = (1<<2); // test port on
}
avr123.nm.ru » 13 май 2014, 21:10
Посмотрите примеры компилятора или на keil.com и сравните.

и возможно вот это
/*Assuming that PLL0 has been setup with CCLK = 60Mhz and PCLK also = 60Mhz.*/
должно быть кодом выражено или старт файлом.
Planet001 » 13 май 2014, 21:14
Еще погуглил..
Вот так работает.
Но теперь другая проблема и ее я никак не могу понять.
После выполнения программы ШИМ не останавливается на последнем значении, а прыгает то 50,то 300.
Что не так?
- Код: Выделить всё • Развернуть
#include "lpc21xx.h"
int main(void)
{
/*Assuming that PLL0 has been setup with CCLK = 60Mhz and PCLK also = 60Mhz.*/
/*This is a per the Setup & Init Sequence given in the tutorial*/
int a;
PINSEL0 = (1<<1); // Select PWM1 output for Pin0.0
PWMPR = 0; // 1 micro-second resolution
PWMMR0 = 600; // freq (T-period 15 000 000\600)
PWMMR1 = 50; // duty cycle
PWMMCR = (1<<1); // Reset PWMTC on PWMMR0 match
PWMPCR = (1<<9); // enable PWM output
PWMLER = (0<<1); // no update MR0 and MR1
PWMTCR = (1<<0)|(1<<3); //ENABLE COUNTER
for (a=1;a<100000;a++)
{}
PWMMR1 = 300 ;
PWMLER = ( 1 << 1 ) ;
//PINSEL2 = (0<<2)|(0<<3);
IO0DIR = (1<<2);
IO0SET = (1<<2); // test port on
for (a=1;a<100000;a++)
{}
PWMMR1 = 50 ;
PWMLER = ( 1 << 1 ) ;
}
avr123.nm.ru » 13 май 2014, 21:17
попробуйте перед последней скобкой поставить
while(1);
Planet001 » 13 май 2014, 22:54
avr123.nm.ru писал(а):Посмотрите примеры компилятора или на keil.com и сравните.

и возможно вот это
/*Assuming that PLL0 has been setup with CCLK = 60Mhz and PCLK also = 60Mhz.*/
должно быть кодом выражено или старт файлом.
а может не будем?
Добавлено спустя 2 минуты 59 секунд:avr123.nm.ru писал(а):попробуйте перед последней скобкой поставить
while(1);
Благодарю за конструктивную помощь.Спасибо.А то уж подумал что-то:)...
Добавлено спустя 1 час 32 минуты 48 секунд:Возник еще вопросик.
Когда я выключаю выход ШИМ
PWMPCR = (0<<9); // disable PWM output
То ШИМ в последний момент выстреливает на 3.3 вольта.Это видно на присоединенном к ноге конденсаторе,который заряжается через резистор импульсами ШИМ.То есть Duty Cycle во время работы выставлен на 0,5 вольта на конденсаторе и при PWMPCR = (0<<9) вольтаж на конденсаторе сразу 3.3
Как сделать,чтобы шим выключался в ноль,а не в 1?
avr123.nm.ru » 13 май 2014, 23:06
наверно 0 вывести на ножку.
Planet001 » 13 май 2014, 23:28
avr123.nm.ru писал(а):наверно 0 вывести на ножку.
да..еще раз спасибо.
Planet001 » 14 май 2014, 05:06
и еще вопрос...
Формула вычисления частоты ШИМ,которую я нашел в каком-то форуме такова:
60 мгц\4=15мгц, 15мгц\значение PWMMR0.
А есть ли методы, позволяющие делить 60 мгц, например на 2 или совсем не делить?
Как бы получить 10 бит на частоте ~30 кгц?
avr123.nm.ru » 15 май 2014, 00:22
делитель наверно в стартап файле настраивается.
Planet001 » 15 май 2014, 14:40
Уже перед предыдущим постом пробовал менять разные значения.Потом в протеусе эмулировал.Частота ШИМ никак не меняется. Ни туда , ни сюда.
Вот эта секция.
- Код: Выделить всё • Развернуть
; VPBDIV definitions
VPBDIV EQU 0xE01FC100 ; VPBDIV Address
;// <e> VPBDIV Setup
;// <i> Peripheral Bus Clock Rate
;// <o1.0..1> VPBDIV: VPB Clock
;// <0=> VPB Clock = CPU Clock / 4
;// <1=> VPB Clock = CPU Clock
;// <2=> VPB Clock = CPU Clock / 2
;// <o1.4..5> XCLKDIV: XCLK Pin
;// <0=> XCLK Pin = CPU Clock / 4
;// <1=> XCLK Pin = CPU Clock
;// <2=> XCLK Pin = CPU Clock / 2
;// </e>
VPBDIV_SETUP EQU 2
VPBDIV_Val EQU 2
; Phase Locked Loop (PLL) definitions
PLL_BASE EQU 0xE01FC080 ; PLL Base Address
PLLCON_OFS EQU 0x00 ; PLL Control Offset
PLLCFG_OFS EQU 0x04 ; PLL Configuration Offset
PLLSTAT_OFS EQU 0x08 ; PLL Status Offset
PLLFEED_OFS EQU 0x0C ; PLL Feed Offset
PLLCON_PLLE EQU (1<<0) ; PLL Enable
PLLCON_PLLC EQU (1<<1) ; PLL Connect
PLLCFG_MSEL EQU (0x1F<<0) ; PLL Multiplier
PLLCFG_PSEL EQU (0x03<<5) ; PLL Divider
PLLSTAT_PLOCK EQU (1<<10) ; PLL Lock Status
;// <e> PLL Setup
;// <o1.0..4> MSEL: PLL Multiplier Selection
;// <1-32><#-1>
;// <i> M Value
;// <o1.5..6> PSEL: PLL Divider Selection
;// <0=> 1 <1=> 2 <2=> 4 <3=> 8
;// <i> P Value
;// </e>
PLL_SETUP EQU 0
PLLCFG_Val EQU 0x00000024
avr123.nm.ru » 15 май 2014, 15:39
Пробуйте в симуляторе в KEIL
Planet001 » 15 май 2014, 17:18
Да, симулятор помог.Я там посмотрел какой регистр управляет делением.Стояло,конечно же,1\4.
Потом в теле main просто жестко прописал:
VPBDIV = 0x01;
И пошло как нужно. 30 кгц 2000 позиций, вместо ~500-600
Спасибо.