| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Скоростомер 16f877 http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=11270 |
Страница 1 от 1 |
| Автор: | derser [ Сря Апр 10, 2013 5:46 pm ] |
| Заглавие: | Скоростомер 16f877 |
Здравейте.Трябва да направя скоростомер с 16F877.Ще използвам режим захват на модул CCP1,TMR1.Не мие проблем да си напиша програмата не нещо ми се губи с математиката.В този режим ще оз,еря периода мога да получа velocity speed=ъглова скорост (V=6,28xr/T);T=period r=радиуса на колелото=34см.Им и друг проблем искам да използвам контролера на 20Mhz а това означава че на ниска скорост ще има препълване.Трянва ми математиката за извличане на Км-час.Ако мoеже да ми дадете някакъв съвет? Людмил derser@mail.bg |
|
| Автор: | MYXATA [ Сря Апр 10, 2013 6:28 pm ] | |||||||||
| Заглавие: | Re: Скоростомер 16f877 | |||||||||
To i gramatikata ti se gubi, ne samo matematikata |
||||||||||
| Автор: | MYXATA [ Сря Апр 10, 2013 6:34 pm ] |
| Заглавие: | Re: Скоростомер 16f877 |
1.Kato imash radiusa na koleloto - nameri mu obikolkata 2. kato imash obikolkata, za edin oborot na edinica vreme tova ti e e patia izminat za edinica vreme:!: 3. pro4eti 1km kolko metra ima, edin metur kolko santimetra 4.1 sm kolko mm i t.n. 5. 1 4as kolko sekundi ima tova e po natam she si razdelish 1km na tvoita edinica pat i taka shte imash km/edinica vreme. sasdtoto i s vremeto sorry za sliokavicata, ama pri nas e taka |
|
| Автор: | ToHu [ Сря Апр 10, 2013 8:28 pm ] |
| Заглавие: | Re: Скоростомер 16f877 |
Ами като цяло задачата е доста тривиална, в какъв режим ще работиш е изцяло твой избор дали ще мериш дължина на импулс или честота зависи единствено от това къде и какъв ти е датчика и колко импулса получаваш, ако не са много импулсите логично е да мериш период което и смяташ да правиш. Дали ще се препълни таймера зависи от настройките, но по скоро не разбирам защо ти е 20 Mhz честота, е разбира се ако процесора освен скоростта смята още един куп неща може би, но за тази сметка нещата са прости. Сега не ми се смята, но може да се окаже че с подходяща настройка на таймера и кепчър модула дори няма да имаш нужда да делиш, може дори и умножението различно от х2 и степени на две да ти се размине, зависи разбира се какви коефициенти се получават. както е писал по голе колегата сметката е проста, трябва да занеш предавателно отношение на диференциалаи какви импулси ти дава тоя датчик, разбира се може да имаш данни директно за импулси / оборот на колелото, примерно 10 импулса за оборот, да речем таймера е сетнат на 100 uS да цъка, приемаме съвсем формално че обиколката на гумата е 1.20 м, така при 100 км/ч имаш : 100 км/ч ~27.77 m/s или това са горе долу 23.15 оборота на колелото което са ти 231.5 импулса. В този случай импулса ти е 4.31 mS или 43 при таймер 100 us това са 43 импулса. Сега нямам спомен дали на тоя проц кепчъра може да работи в 16 битов режим, ако може нещата са лесни, ако не може са малко по-сложни, но не много. Хубаво е да е 16 битов за д аимаш точност. В примера по-горе ми се струва че разделителна способност от 100us може би няма да е достатъчна, зависи каква точност на отчитане търсиш. Не случайно съм решил задачата в обратен ред, мисля от това лесно може да си направиш математиката. Също така не пропускай че имаш определени параметри, примерно обиколка на гумата, импулси на оборот както и превръщания секунди/часове и м / км, всичко това може да се изчисли предварително така че да са ти минимално редуцирани сметките в нещото, не забравяй че менейки периода на таймера ти всъщност реализираш делене на определено число, това може също да оптимизира математиката. |
|
| Автор: | derser [ Чет Апр 11, 2013 9:20 am ] |
| Заглавие: | Re: Скоростомер 16f877 |
Здравейте.Благодаря за съветите.Да така е ще се вършат и други неща=ще се мери температура,ще се мери осветеност която ще регулира подсвета на дисплея автоматично в зависимост от околната осветеност=това с един ШИМ,това не може да стане на 4 Mhz.Може но много ще се бави.Малко по сметките.Радиус на колелото 34 см.34X6,28=213.52М Обиколката е 213.52 см на колелото-213./ако се приеме че за 1с колелото изминава 2.1352 метра то-2,13x3600/1000=7.6668 Един час има 3600с получава се един коефициент 7,6 по който се имножават импулсите преброени за 1с и получаваме Km/h.Това е по простото.Искам да го направя с мерене на период защото скоростомера ще има по голяма динамика-по бърза реакция на промяна.След като съм на 20Mhz предделителя на таймера е на максимум-но при честота на входа аколо 1-2 херца или 1-2 оборота в секунда-имаме препълване.Таймера е 16 бита.65536x8=524288 .Това е максималното което може да преброи-или-0,524288=1/0.524=1.9 Херца /2/Това означава че много ниски скорости ще има препълванеза високите нама проблем.При 20Mgz което е=0.00000005=50нс умноженоx4 прави един машинен цикъл за 200нс и с това трябва да се съобразим. ;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&7 Поздрав. |
|
| Автор: | stefan63 [ Чет Апр 11, 2013 10:24 am ] |
| Заглавие: | Re: Скоростомер 16f877 |
Не знам какво може конкретния контролер и не е важно, важно е какво търсиш. Съмнява ме задачата ти да не може да се реши и с такт 1MHz. Имаш таймер, който може да отброява бързи времена. Голям 32-битов брояч и второ негово копие за сметки. Нулираш ги и разрешаваш прекъсване по началото на импулса. Правиш IRQ-прекъсване по началото на импулса(или по сигнал за захват, когато таймерът реагира на началото на импулса). Спираш таймера(ако трябва) ,сумираш го към 32-битовия брояч, нулираш таймера и го пускаш. Тук имаш някакви микросекунди загуби, които трябва да отчетеш някак си- например вместо да нулираш - можеш да заредиш таймера със стойност, която отговаря на времето ти за обработката до момента -при условие , че си блокирал останалите прекъсвания. Копираш 32 битовия в копието за сметки и нулираш. Излизаш от прекъсване. Следиш таймера (с прекъсване или с проверка)-колкото пъти препълни - толкова пъти прибавяш 65536 към 32-битовия брояч. На следващото прекъсване - повтаряш. Това е без да ползваш режим захват, ако го ползваш - ще се повиши точността , но принципът е същия - трябва да направиш голям брояч. На поредното прекъсване имаш нова стойност на 32 битовия брояч - това е времето на периода в някакви единици. Да речем ,че е в микросекунди. При тебе 7'686'720 микросекунди са 1 km/h - 22..23 бита. От големия брояч ти остават 10 бита - достатъчно да покрият 0...1000 км/h. Делиш 32битовия брояч на 7686720 и получаваш скоростта в км/ч. Това изисква 32 битова аритметика. Ако пожертваш точност - можеш да минеш с 16 бита. Ако усложниш логиката - за ниски скорости можеш да имаш един делител, за високи скорости - друг делител. Ако имаш делител 1024 на таймера - можеш да делиш на 750 , със неточност около 0,1%. ;----------------------- Един импулс на оборот е достатъчно за управление на селскостопанска техника или пералня. Ако искаш по-висока точност и бързодействие- трябва да увеличиш броя импулси. |
|
| Автор: | stefan63 [ Чет Апр 11, 2013 10:46 am ] |
| Заглавие: | Re: Скоростомер 16f877 |
Оплескал съм се, трябва да делиш 7686720 на микросекундите в голямия брояч. Ако в него имаш 768672- скоростта ще ти е 10 км/ч. |
|
| Автор: | ToHu [ Чет Апр 11, 2013 8:47 pm ] |
| Заглавие: | Re: Скоростомер 16f877 |
Относно тактовата честота, това което си описал спокойно си става с 4 Mhz клок, може и на 1 Mhz както е писал стефан по горе, всичко зависи как го напишеш, в крайна сметка нямаш нищо което да изисква 20 Mhz и такъв малък такт, освен ако не искаш да регулираш дисплея на всеки 1-2 mS .... На 4 Mhz инструкциите са ти на 1 uS , това е доста малко време съпоставено към задачата която решаваш и характера на данните. Най-критичното ти е скоростта, а за там имаш време предостатъчно за да я ъпдейтваш поне 10-на пъти в секунда, но за това не бих ползвал 32 бита аритметика както предлага стефан, там може да изгубиш безсмислено много време за нещо което не е нужно. 0.1% точност за която споменава /не съм смятал, разчитам че е сметнал вярно/ не можеш да постигнеш по-никакъв начин,това е като да мериш диаметъра на арматура с микрометър ... гумите не са с точност 0.1% като обиколка, размера им се променя, има преплъзване, предавателното число което имаш за импулсите не е измерено с таква точност и ти няма как да го измериш тъй като нито може да определиш завъртането на колелото с точност 0.1% нито може да си засечеш външно скоростта с таква точност. Иначе това което предлага стефан е тов акоето съм ти писал и аз, но при условеи че не може да се сложи прескалер на T1 когато работи в CCP режим, аз лично нямам спомен вече специално за кепчър режим може ли или не може. Ако не може, и все пак препълваш, забравяш тоя кепчър режим, и както и той ти е писал, сигнала на прексъване, един таймер да цъка и толкоз. |
|
| Автор: | Cekins [ Пет Апр 12, 2013 9:47 am ] |
| Заглавие: | Re: Скоростомер 16f877 |
Може да се слага прескалер на таймера - няма проблеми. Препълването просто си го отчитам като допълнителен бит (битове) в някаква променлива чрез прекъсване от самия таймер. Малко трябва да се внимава само кога кое прекъсване настъпва и се обработва. Честно казано понякога нямам особено доверие на вътрешния такт - някакси не го чувствам точен. И за това обикновенно слагам един 32к външен. Специално за ПИК никога не ми е било някъв сериозен овърхед - а и винаги генератора ми е тръгвал. Тъй че 10-20 стотинки повече за кварц и два кондензатора ти решават всички проблеми. Пък там вече можеш с прескалер до 8 да го докараш да се препълва на 16 секунди - това според мен е зверски много време проца да разбере че си спрял. Реално пак ще си се ползва прекъсването на таймера за индикация на липса на импулси. |
|
| Автор: | derser [ Пон Апр 15, 2013 7:25 pm ] |
| Заглавие: | Re: Скоростомер 16f877 |
Здравейте.Оказа се че има проблем с четенето и записа в EEPROM ;******************************************************88 Ще напиша кода ако има нещо грешно или не на място.. bank_0 movfw eep_adr bank_2 movwf EEADR ;****************** bank_0 movfw data_temp bank_2 movwf EEDATA ;******************** bank_3 bcf EECON1,EEPGD bsf EECON1,WREN movlw 0x55 movwf |
|
| Автор: | derser [ Пон Апр 15, 2013 8:03 pm ] |
| Заглавие: | Re: Скоростомер 16f877 |
извинявам се грешката.стана нещо с редактора. не се получава четенето и записа в режим дебугер. процесора на 20Mgz ако има нещо грешно или не на място..? като гледам битове-WR,RD ВЪВ WATCH прозореца не се помръдват само бит WREN се вдига. про окончателно програмиране също няма четене запис Поздрав" ;**************************************** четене ;******* bank_0 movfw eep_adr bank2 movwf EEADR bank_3 bcf EECON1,EEPGD bsf EECON1,RD bank_2 movfw EEDATA bank_0 movwf data_temp movfw eep_adr sublw 0x02 btfsc STATUS,Z goto $+3 incf eep_adr return clrf eep_adr return ;************************************** запис ;*********************** bank_0 bcf INTCON,GIE movfw eep_adr bank_2 movwf EEADR bank_0 movfw data_temp bank_2 movwf EEDATA ;***********************8 bank_3 bcf EECON1,EEPGD bsf EECON1,WREN movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 ;********************** bsf EECON1,WR btfsc EECON1,WR goto $-.1 bcf EECON1,WREN ;*************************** bank_0 movfw eep_adr sublw 0x02 btfsc STATUS,Z goto $+.3 incf eep_adr return clrf eep_adr bsf INTCON,GIE return ;*******************8 |
|
| Автор: | didofen [ Пон Апр 22, 2013 9:48 am ] |
| Заглавие: | Re: Скоростомер 16f877 |
аз го правя така BCF PIR1, 7 BSF STATUS , RP1 CLRF EEDATА BCF STATUS, RP1 MOVF ADRZAP, 0 BSF STATUS, RP1 MOVWF EEADR BSF STATUS , RP0 BSF EECON1 , WREN MOVLW 0x55 MOVWF EECON2 MOVLW 0xAA MOVWF EECON2 BSF EECON1 , WR BCF STATUS , RP0 BCF STATUS , RP1 LOOP CLRWDT BTFSS PIR1, 7 GOTO LOOP |
|
| Автор: | derser [ Пон Апр 22, 2013 10:50 am ] |
| Заглавие: | Re: Скоростомер 16f877 |
Здравейте.Благодаря за кода.Да,то няма много варианти.Оправих се.Направих ги като макроси,и станаха нещата.Ако приемеме че дневно има поне 10 записа в паметта,колко време би издържала преди да се наложи да сменям?Дойде ред и на меренето на осветеност.трябва да се използва преобразувател ток напрежение за фотодиода,поне до накъде има някаква линейна зависимост,на осветеноста и тока през диода.Ако може някой да ми даде накаква пробвана схема.Като се има предвид че се работи на 5 волта,те са много операционите за еднополярно.Правя проби с CA3140,той работи от4 до36 волта.;*********************************************************8 Поздрав:Людмил derser@mail.bg |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|