|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 12:18 am
|
Страница 1 от 1
|
[ 12 мнения ] |
|
Малко помощ за PWM на 18F4431
| Автор |
Съобщение |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Малко помощ за PWM на 18F4431
Може ли някой да ми каже как да задавам времена за различните канали??? Примерно ако ползвам PWM1 той има 2 канала(пин 33 и 34). Ясно е, че трябва да избера комплиментарен мод. Искам да генерирам примерно 10 импулса на пин 33(пин 34 не е активен) и след това още 10 на пин 34. Това, което намерих като команда е set_power_pwmX_duty(duty) (за CCS complier). Искам да знам как да работя с двата канала по отделно. Благодаря!
_________________www.elkran.com
|
| Пет Мар 23, 2012 7:25 pm |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Малко помощ за PWM на 18F4431
Намерих каквото ми трябваше. Благодаря все пак!
_________________www.elkran.com
|
| Съб Мар 24, 2012 10:09 pm |
|
 |
|
gicho
Ранг: Форумен бог
Регистриран на: Пон Мар 13, 2006 1:59 pm Мнения: 3867 Местоположение: Габрово
|
 Re: Малко помощ за PWM на 18F4431
Колега, откъде докопа този 4431? Трябва ми спешно (днес, утре) нещо с 3-фазен PWM, ама в комет няма. Да не би да ти се намира една излишна бройка?
|
| Пон Мар 26, 2012 9:18 am |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Малко помощ за PWM на 18F4431
Моите са под бройка, но кажи на комет да ти доставят. Идват за 2-3 дни. Успех!
_________________www.elkran.com
|
| Пон Мар 26, 2012 10:42 am |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Малко помощ за PWM на 18F4431
Колеги, тук имам малка загадка. Научих се да работя с ПВМ на този 18Ф4431, но имам проблем с периферията му. Свързал съм двуредов дисплей към порт С, а за управляващи сигнали използвам порт Е. Когато използвам друг чип примерно 4520, 4620 и т. н. дисплея работи без проблем. Когато обаче заредя същата програма на 4431, чипа блокира и дори не иска да инциализира дисплея. Някакви идеи???
_________________www.elkran.com
|
| Вто Апр 03, 2012 10:54 am |
|
 |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
 Re: Малко помощ за PWM на 18F4431
Преди дисплея се инициализира контролера. Може да им съвпадат изводите, но имат разлика в регистрите. Не може просто да запишеш хекса на подобен контролер и да очакваш да тръгне.
|
| Вто Апр 03, 2012 12:18 pm |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Малко помощ за PWM на 18F4431
Е сменям хедър файла! Явно понеже този има доста допълнителни функции и прави проблем.
_________________www.elkran.com
|
| Вто Апр 03, 2012 12:25 pm |
|
 |
|
Gogo
Ранг: Форумен бог
Регистриран на: Чет Фев 24, 2005 11:41 pm Мнения: 1049 Местоположение: Pz
|
 Re: Малко помощ за PWM на 18F4431
A ADC-то конфигурирал ли си? Ако не си, PORTE ти е аналогови входове! 
|
| Сря Апр 04, 2012 8:13 am |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Малко помощ за PWM на 18F4431
Gogo жив да си! Оправих периферията обаче имам питане за самия PWM. Направих си програмка, която използва прекъсване за зареждане на ШИМ. Използвам променлива boolpwm, чрез която отчитам дали е заредена новата стойност. В самата програма изчаквам докато boolpwm стане 0: [/code]boolpwm=1; while(boolpwm==1);[/code] Лошото е, че това причинява някакви смущения в програмата и много голяма част от импулсите не се генерират. Не знам защо. Какво става???
_________________www.elkran.com
|
| Чет Апр 05, 2012 4:34 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Малко помощ за PWM на 18F4431
PWM-а генерира прекъсване (всъщност таймера който се ползва), когато това стане спокойно можеш да запишеш следващата стойност - тя ще се зареди чак при новия цикъл - и така не би трябвало да има гличове.
|
| Чет Апр 05, 2012 7:11 pm |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 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(); }
}
|  |  |  |  |
Не съм работил с такъв интерфейс до сага. Възможно е кардинално да бъркам нещо.
_________________www.elkran.com
|
| Чет Апр 05, 2012 8:31 pm |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Малко помощ за PWM на 18F4431
Сега да напиша за поколенията. Да знаят. Проблемите са няколко. Първо: Този ШИМ модул не дели входната честота на 4, както правят обикновено ПИК-четата, а я подава 1 към 1. От тук се получава първото разминаване. Второ: Периодът се задава чрез 12 битова променлива, а set_power_pwmХ_duty() използва 14 битова. Ето от тук идва разликата. Ако периода е, както в случая 3100, то за изчисляване duty cycle трябва да се ползва 4 пъти го голяма стойност - 12400. Третата ми грешка в случая е, че не изчаквам да завърши последния импулс от серията, а директно преминавам към следващата полувълна. Но това е бял кахър. Дано да съм полезен на някого!
_________________www.elkran.com
|
| Съб Апр 07, 2012 2:04 pm |
|
|
|
Страница 1 от 1
|
[ 12 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|