Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Малко помощ за PWM на 18F4431
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=9985
Страница 1 от 1

Автор:  stoyanoff [ Пет Мар 23, 2012 7:25 pm ]
Заглавие:  Малко помощ за PWM на 18F4431

Може ли някой да ми каже как да задавам времена за различните канали???
Примерно ако ползвам PWM1 той има 2 канала(пин 33 и 34). Ясно е, че трябва да избера комплиментарен мод.
Искам да генерирам примерно 10 импулса на пин 33(пин 34 не е активен) и след това още 10 на пин 34.
Това, което намерих като команда е set_power_pwmX_duty(duty) (за CCS complier).
Искам да знам как да работя с двата канала по отделно.
Благодаря!

Автор:  stoyanoff [ Съб Мар 24, 2012 10:09 pm ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

Намерих каквото ми трябваше. Благодаря все пак!

Автор:  gicho [ Пон Мар 26, 2012 9:18 am ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

Колега, откъде докопа този 4431? Трябва ми спешно (днес, утре) нещо с 3-фазен PWM, ама в комет няма. Да не би да ти се намира една излишна бройка?

Автор:  stoyanoff [ Пон Мар 26, 2012 10:42 am ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

Моите са под бройка, но кажи на комет да ти доставят. Идват за 2-3 дни. Успех!

Автор:  stoyanoff [ Вто Апр 03, 2012 10:54 am ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

Колеги, тук имам малка загадка. Научих се да работя с ПВМ на този 18Ф4431, но имам проблем с периферията му. Свързал съм двуредов дисплей към порт С, а за управляващи сигнали използвам порт Е. Когато използвам друг чип примерно 4520, 4620 и т. н. дисплея работи без проблем. Когато обаче заредя същата програма на 4431, чипа блокира и дори не иска да инциализира дисплея.
Някакви идеи???

Автор:  CarBeta [ Вто Апр 03, 2012 12:18 pm ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

Преди дисплея се инициализира контролера. Може да им съвпадат изводите, но имат разлика в регистрите. Не може просто да запишеш хекса на подобен контролер и да очакваш да тръгне.

Автор:  stoyanoff [ Вто Апр 03, 2012 12:25 pm ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

Е сменям хедър файла! Явно понеже този има доста допълнителни функции и прави проблем.

Автор:  Gogo [ Сря Апр 04, 2012 8:13 am ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

A ADC-то конфигурирал ли си? Ако не си, PORTE ти е аналогови входове! :D

Автор:  stoyanoff [ Чет Апр 05, 2012 4:34 pm ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

Gogo жив да си!
Оправих периферията обаче имам питане за самия PWM. Направих си програмка, която използва прекъсване за зареждане на ШИМ.
Код:
#INT_PWMTB
void SetPvm()
{
set_power_pwm0_duty(nextpulse);
set_power_pwm2_duty(nextpulse);
boolpwm=0;
}

Използвам променлива boolpwm, чрез която отчитам дали е заредена новата стойност. В самата програма изчаквам докато boolpwm стане 0:
[/code]boolpwm=1;
while(boolpwm==1);[/code]
Лошото е, че това причинява някакви смущения в програмата и много голяма част от импулсите не се генерират. Не знам защо.
Какво става???

Автор:  Cekins [ Чет Апр 05, 2012 7:11 pm ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

PWM-а генерира прекъсване (всъщност таймера който се ползва), когато това стане спокойно можеш да запишеш следващата стойност - тя ще се зареди чак при новия цикъл - и така не би трябвало да има гличове.

Автор:  stoyanoff [ Чет Апр 05, 2012 8:31 pm ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

Ами аз уж това правя. Основната програма намира новата стойност и чака while(boolpwm==1);. Когато се вдигне флага за прекъсване (#INT_PWMTB ), зареждам новите стойности и променям boolpwm=0.
Лошото е, че изхода не е какъвто трябва да бъде. Много голяма част от импулсите не се генерират.
Ето пълния код на програмата:

Код:
#include <18F4431.h>
#FUSES HS
#use delay(clock=25000000)


int16 arr[21]={0,480,960,1410,1820,2190,2510,2760,2940,3060,3090,3090,3060,2940,2760,2510,2190,1820,1410,960,480};

int16 nextpulse,frequency;
int1 boolpwm;

#INT_PWMTB
void SetPvm()
{
set_power_pwm0_duty(nextpulse);
set_power_pwm2_duty(nextpulse);
boolpwm=0;
}


void PowerPwmPolaritySwap(int1 swap)
{
switch(swap)
{
case 0:{
set_power_pwm_override(1,true,0);
set_power_pwm_override(0,false,1);
set_power_pwm_override(2,true,0);
set_power_pwm_override(3,false,1);

break;
}
case 1:{
set_power_pwm_override(0,true,0);
set_power_pwm_override(1,false,1);
set_power_pwm_override(3,true,0);
set_power_pwm_override(2,false,1);

break;
}
}
}


void TurningLoop()
{
int16 i;
for(i=1;i<21;i++)
{
nextpulse=arr[i];
boolpwm=1;
while(boolpwm==1);
}
}

//Full Period Wave
void FullPeriodWave()
{
PowerPwmPolaritySwap(0);
TurningLoop();
PowerPwmPolaritySwap(1);
TurningLoop();
}

void main(){
delay_ms(3000);

nextpulse=0;
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_PWMTB);
setup_power_pwm_pins(PWM_BOTH_ON,PWM_BOTH_ON,PWM_OFF,PWM_OFF);
setup_power_pwm(PWM_FREE_RUN, 1, 0, 3100, 0, 1,15);
set_power_pwm0_duty(nextpulse);
set_power_pwm2_duty(nextpulse);
while(1){
frequency=50;
FullPeriodWave();
}

}

Не съм работил с такъв интерфейс до сага. Възможно е кардинално да бъркам нещо.

Автор:  stoyanoff [ Съб Апр 07, 2012 2:04 pm ]
Заглавие:  Re: Малко помощ за PWM на 18F4431

Сега да напиша за поколенията. Да знаят. Проблемите са няколко.
Първо: Този ШИМ модул не дели входната честота на 4, както правят обикновено ПИК-четата, а я подава 1 към 1. От тук се получава първото разминаване.
Второ: Периодът се задава чрез 12 битова променлива, а set_power_pwmХ_duty() използва 14 битова. Ето от тук идва разликата. Ако периода е, както в случая 3100, то за изчисляване duty cycle трябва да се ползва 4 пъти го голяма стойност - 12400.
Третата ми грешка в случая е, че не изчаквам да завърши последния импулс от серията, а директно преминавам към следващата полувълна. Но това е бял кахър.
Дано да съм полезен на някого!

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/