|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 12:28 am
|
Страница 1 от 1
|
[ 13 мнения ] |
|
| Автор |
Съобщение |
|
derser
Ранг: Минаващ
Регистриран на: Сря Апр 10, 2013 5:34 pm Мнения: 7
|
 Скоростомер 16f877
Здравейте.Трябва да направя скоростомер с 16F877.Ще използвам режим захват на модул CCP1,TMR1.Не мие проблем да си напиша програмата не нещо ми се губи с математиката.В този режим ще оз,еря периода мога да получа velocity speed=ъглова скорост (V=6,28xr/T);T=period r=радиуса на колелото=34см.Им и друг проблем искам да използвам контролера на 20Mhz а това означава че на ниска скорост ще има препълване.Трянва ми математиката за извличане на Км-час.Ако мoеже да ми дадете някакъв съвет? Людмил derser@mail.bg
|
| Сря Апр 10, 2013 5:46 pm |
|
 |
|
MYXATA
Ранг: Форумен бог
Регистриран на: Пон Юни 05, 2006 1:48 pm Мнения: 4906 Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
|
 Re: Скоростомер 16f877
 |  |  |  | derser написа: Здравейте.Трябва да направя скоростомер с 16F877.Ще използвам режим захват на модул CCP1,TMR1.Не мие проблем да си напиша програмата не нещо ми се губи с математиката.В този режим ще оз,еря периода мога да получа velocity speed=ъглова скорост (V=6,28xr/T);T=period r=радиуса на колелото=34см.Им и друг проблем искам да използвам контролера на 20Mhz а това означава че на ниска скорост ще има препълване.Трянва ми математиката за извличане на Км-час.Ако мoеже да ми дадете някакъв съвет? Людмил derser@mail.bg |  |  |  |  |
To i gramatikata ti se gubi, ne samo matematikata 
_________________ ... ако трети ден не ти се работи... това означава, че е сряда !
|
| Сря Апр 10, 2013 6:28 pm |
|
 |
|
MYXATA
Ранг: Форумен бог
Регистриран на: Пон Юни 05, 2006 1:48 pm Мнения: 4906 Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
|
 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 
_________________ ... ако трети ден не ти се работи... това означава, че е сряда !
|
| Сря Апр 10, 2013 6:34 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 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 може би няма да е достатъчна, зависи каква точност на отчитане търсиш. Не случайно съм решил задачата в обратен ред, мисля от това лесно може да си направиш математиката. Също така не пропускай че имаш определени параметри, примерно обиколка на гумата, импулси на оборот както и превръщания секунди/часове и м / км, всичко това може да се изчисли предварително така че да са ти минимално редуцирани сметките в нещото, не забравяй че менейки периода на таймера ти всъщност реализираш делене на определено число, това може също да оптимизира математиката.
|
| Сря Апр 10, 2013 8:28 pm |
|
 |
|
derser
Ранг: Минаващ
Регистриран на: Сря Апр 10, 2013 5:34 pm Мнения: 7
|
 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 Поздрав.
|
| Чет Апр 11, 2013 9:20 am |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 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%.
;----------------------- Един импулс на оборот е достатъчно за управление на селскостопанска техника или пералня. Ако искаш по-висока точност и бързодействие- трябва да увеличиш броя импулси.
|
| Чет Апр 11, 2013 10:24 am |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: Скоростомер 16f877
Оплескал съм се,  трябва да делиш 7686720 на микросекундите в голямия брояч. Ако в него имаш 768672- скоростта ще ти е 10 км/ч.
|
| Чет Апр 11, 2013 10:46 am |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 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 режим, аз лично нямам спомен вече специално за кепчър режим може ли или не може. Ако не може, и все пак препълваш, забравяш тоя кепчър режим, и както и той ти е писал, сигнала на прексъване, един таймер да цъка и толкоз.
|
| Чет Апр 11, 2013 8:47 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Скоростомер 16f877
Може да се слага прескалер на таймера - няма проблеми. Препълването просто си го отчитам като допълнителен бит (битове) в някаква променлива чрез прекъсване от самия таймер. Малко трябва да се внимава само кога кое прекъсване настъпва и се обработва. Честно казано понякога нямам особено доверие на вътрешния такт - някакси не го чувствам точен. И за това обикновенно слагам един 32к външен. Специално за ПИК никога не ми е било някъв сериозен овърхед - а и винаги генератора ми е тръгвал. Тъй че 10-20 стотинки повече за кварц и два кондензатора ти решават всички проблеми. Пък там вече можеш с прескалер до 8 да го докараш да се препълва на 16 секунди - това според мен е зверски много време проца да разбере че си спрял. Реално пак ще си се ползва прекъсването на таймера за индикация на липса на импулси.
|
| Пет Апр 12, 2013 9:47 am |
|
 |
|
derser
Ранг: Минаващ
Регистриран на: Сря Апр 10, 2013 5:34 pm Мнения: 7
|
 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
|
| Пон Апр 15, 2013 7:25 pm |
|
 |
|
derser
Ранг: Минаващ
Регистриран на: Сря Апр 10, 2013 5:34 pm Мнения: 7
|
 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
|
| Пон Апр 15, 2013 8:03 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
 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
|
| Пон Апр 22, 2013 9:48 am |
|
 |
|
derser
Ранг: Минаващ
Регистриран на: Сря Апр 10, 2013 5:34 pm Мнения: 7
|
 Re: Скоростомер 16f877
Здравейте.Благодаря за кода.Да,то няма много варианти.Оправих се.Направих ги като макроси,и станаха нещата.Ако приемеме че дневно има поне 10 записа в паметта,колко време би издържала преди да се наложи да сменям?Дойде ред и на меренето на осветеност.трябва да се използва преобразувател ток напрежение за фотодиода,поне до накъде има някаква линейна зависимост,на осветеноста и тока през диода.Ако може някой да ми даде накаква пробвана схема.Като се има предвид че се работи на 5 волта,те са много операционите за еднополярно.Правя проби с CA3140,той работи от4 до36 волта.;*********************************************************8 Поздрав:Людмил derser@mail.bg
|
| Пон Апр 22, 2013 10:50 am |
|
|
|
Страница 1 от 1
|
[ 13 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|