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

С-заяк търси помощ
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=11553
Страница 1 от 1

Автор:  peast [ Пон Юли 15, 2013 10:47 am ]
Заглавие:  С-заяк търси помощ

Опитвам се да премина от Асемблер на С, но не мога да се справя с ADC - симулаторът не помага. Ако ви се занимава, вижте кода - вероятно допускам елементарна грешка, Идеята е ADRESH да се вкара в CCPR1L, като преди това малко се преработи. Осцилоскопът обаче показва, че PWM сигнал има само за 0.1 сек от включване на захранването. Хардуерът е наред.

#include <pic.h>
#include "delay.h"
#include <pic16f684.h>
#define set_bit(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define clear_bit(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define flip_bit(ADDRESS,BIT) (ADDRESS ^= (1<<BIT))
#define test_bit(ADDRESS,BIT) (ADDRESS & (1<<BIT))
#define _XTAL_FREQ 8000000

void Init();
__CONFIG ( FOSC_INTOSCIO & WDTE_OFF & MCLRE_OFF & PWRTE_OFF & BOREN_OFF & CP_OFF & CPD_OFF);
//volatile char dc;
char dc;

void main()
{
Init();
while(1) //Loop Forever
{
DelayMs(12);
ADCON0, GO = 1;
while (ADCON0, GO){}
dc = ADRESH;
// dc = dc << 8;
if (dc <= 127){
dc = 127 - dc;
clear_bit (PORTA, 4); //pin 3
}
else{
dc = dc - 127;
set_bit (PORTA, 4); //pin 3
}
CCPR1L = dc;
}
}

void Init(){
//OSC
IRCF0 = 1; // Used to set intrc speed to 8 MHz
IRCF1 = 1; // Used to set intrc speed to 8 MHz
IRCF2 = 1; // Used to set intrc speed to 8 MHz
//ADC
PORTA = 0;
TRISA = 0b00000100; // Set RA2 as input - PIN 11
PORTC = 0;
TRISC =0; // All outputs
CMCON0 = 0x07; // Disable the comparator
ADCON0 = 0b00001001; // left, VDD, AN2,ADON
ADCON1 = 0b00100000; // 1/32 fosc
ANSEL = 0b00000100; // Configure AN2 as analog
GIE = 0;
//PWM
CCP1CON = 0b00101100; // RC5 single PWM
ECCPAS = 0; // Auto_shutdown is disabled for now
PR2 = 0b00011000; // Sets PWM Period at 20 kHz
T2CON = 0b00000101; // TMR2 On with 4 prescale
CCPR1L = 0; // Set Duty Cycle to zero
TMR2ON = 1; // Start Timer2
return;
}

Автор:  sparkybg [ Пон Юли 15, 2013 12:10 pm ]
Заглавие:  Re: С-заяк търси помощ

Прочети и ADRESH и ADRESL, независимо че ползваш само едното.

Например:
Код:
dc=ADRESL;
dc=ADRESH;


Освен друго, синтаксисът "ADCON0, GO = 0;" ми е малко странен. Сигурен ли си че това се компилира? Запетайката би трябвало да е точка, и да няма празно между нея и "GO". Долу в "while(ADCON0, GO)" - пак така.

Автор:  peast [ Вто Юли 16, 2013 2:34 am ]
Заглавие:  Re: С-заяк търси помощ

Dear Sparkybg,
Нещо не става... И четенето на ADRESL не помага. Относно синтаксиса май това е защото ползвам HI-TECH - компилира се, а по твоя начин дава грешка - нямало структура. С промяна на честоти и TAD достигнах до някакво преобразуване, но много нелинейно, на единия край на потенциометъра на входа на ADC.
Много бях обнадежден, но... ще го мислим пак. Благодаря за отзивчивостта.

Автор:  Cekins [ Вто Юли 16, 2013 5:11 pm ]
Заглавие:  Re: С-заяк търси помощ

Ха тва за нелинейното е вече друга бира. Прочети си даташита на пик-а дето ползваш в раздела за ацп-то и виж какво изходно съпротивление максимално можеш да сложиш. По принцип (като правило) между 5 и 10 килоома максимум. Ако си сложил 100к е нормално да не мери вярно. Някой от по-новите пикове имат буфер на входа и позволяват по високи съпротивления.

Автор:  peast [ Вто Юли 16, 2013 6:31 pm ]
Заглавие:  Re: С-заяк търси помощ

10 килоома.

Автор:  sparkybg [ Вто Юли 16, 2013 6:46 pm ]
Заглавие:  Re: С-заяк търси помощ

Другата причина е да не са нагласени времената на ADC-то. Погледни си в даташита спрямо честотата, на която си пуснал процесора какво Тad трябва да сложиш, и колко Тad периода да сложиш за четене преди да започне да преобразува.

Впрочем, а импеданса дето иска PIC32-ката например, ако искаш да правиш 1000 килосемпъла в секунда, беше някъде към 500 ома. Та случаи има всякакви.

Автор:  Cekins [ Вто Юли 16, 2013 6:55 pm ]
Заглавие:  Re: С-заяк търси помощ

Ами то за потенциометър с по-старите пикове може и с 1 мегаом да стане - като сметнеш колко време ще се зарежда кондензатора и си го задържаш толкова време включен към S/H схемата. Ама пък 2-3 килоома пот не е кой знае колко голям товар 2-3 милиампера не са кой знае кво ако не си на някво батерийно захранване дето се цедят микроамперите...

Автор:  peast [ Пет Юли 19, 2013 10:10 am ]
Заглавие:  Re: С-заяк търси помощ

След няколкодневно зубрене на ADC работите се пооправиха и съоръжението работи. Остана само един проблем. ADRESH се вкарва в CPPR1L, за да се управлява DC. При промяна на DC се променя и амплитудата на PWM сигнала - намалява при увеличаване на DC до изчезване към 85%. Засега не мога да си обясня това, вероятно от неточна настройка на PWM регистрите.
Ще се учи още. Благодаря за съдействието.

Автор:  Cekins [ Пет Юли 19, 2013 10:35 am ]
Заглавие:  Re: С-заяк търси помощ

Бит 4 и 5 в CCP1CON са най-младшите два бита на пвм-дютито. По принцип ако не ги ползваш трябва да са 0. Освен това PWM-a ще работи нормално (така както си го настроил) при вход от ацп-то десетично от 4 до 96 от там на сетне ще почне да се променя пак от 0. Ако държиш PWM-а да ти е на 20 kHz PR2 трябва да е 100 (десетично), прескалера и постскалера на таймер2 на 0. Резултата от АЦП-то трябва да се приравни на 400 - да се раздели на 2.56 - по лесно става ако се умножи по 100 и се раздели на 256 ако имаш 32 битова целочислена аритметика, и то деленето е просто в случая - маха се младшия байт на резултата. После двата младши бита от крайния резултат се вкарват в съответните битове в CCP1CON а останалите в CCPR1L.

Автор:  peast [ Нед Юли 21, 2013 3:16 pm ]
Заглавие:  Re: С-заяк търси помощ

Не мога да схвана защо при увеличаване на DC амплитудата на PWM пада и към 85% сигналът изчезва. Вижте картинката. Канал 1 е вързан за изхода на PWM, а канал 2 за входа на ADC. Също и напрежението на входа на ADC се движи под 2 v, докато при изваден от цокъла контролер си е нормално - 0 - 5v. Смених PIC-a, но нямаше ефект
Изображение

Автор:  Cekins [ Нед Юли 21, 2013 3:34 pm ]
Заглавие:  Re: С-заяк търси помощ

Ами не знам какво разбираш под амплитуда? На изхода на PWM-а трябва да имаш 1-0 със някакво запълване. Това че размаха ти е 2 волта на него изход въобще не е нормално. АЦП-то ти може да се държи така странно ако го цъкаш много бързо и потенциометъра ти е голям - това за което говорихме по-горе. Там имаш кондензатор който трябва да се зареди. Всъщност всичките ти проблеми са хардуерни + непознаване на принципа на работа на двата модула АЦП и ПВМ. Прочети ги още няколко пъти в даташита и виж какво съм ти писал за ПВМ-а.

ПВМ-а работи като сравнява CCPR1L с таймер 2 - когато този регистър стане равен на таймер 2 изхода се сменя (дали ще е надолу или нагоре си зависи от пвм-а и от настройките). А регистъра PR2 ти определя до колко да ти брои таймер 2 преди да се нулира. Затова ако искаш да ти работи нормално в CCPR1L НЕ ТРЯБВА да слагаш стойност по голяма от PR2 - това ще доведе до неправилна работа на PWM-а.

Автор:  peast [ Нед Юли 21, 2013 5:28 pm ]
Заглавие:  Re: С-заяк търси помощ

Под малка амплитуда на сигнала разбирам това, че импулсите се движат от 0v за лог.нула до 2v за лог.1. По-нагоре не.
За това, че съм тъпак, си прав. Оказа се, че входа на ADC e запоен за съседното краче. Сега всичко прие нормален вид.
Благодаря за всичко. Край на темата.

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