Отговори на тема  [ 12 мнения ] 
С-заяк търси помощ 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 04, 2012 1:51 pm
Мнения: 44
Местоположение: София
Мнение С-заяк търси помощ
Опитвам се да премина от Асемблер на С, но не мога да се справя с 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;
}

_________________
Бай Цветан


Пон Юли 15, 2013 10:47 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: С-заяк търси помощ
Прочети и ADRESH и ADRESL, независимо че ползваш само едното.

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


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


Пон Юли 15, 2013 12:10 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 04, 2012 1:51 pm
Мнения: 44
Местоположение: София
Мнение Re: С-заяк търси помощ
Dear Sparkybg,
Нещо не става... И четенето на ADRESL не помага. Относно синтаксиса май това е защото ползвам HI-TECH - компилира се, а по твоя начин дава грешка - нямало структура. С промяна на честоти и TAD достигнах до някакво преобразуване, но много нелинейно, на единия край на потенциометъра на входа на ADC.
Много бях обнадежден, но... ще го мислим пак. Благодаря за отзивчивостта.

_________________
Бай Цветан


Вто Юли 16, 2013 2:34 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: С-заяк търси помощ
Ха тва за нелинейното е вече друга бира. Прочети си даташита на пик-а дето ползваш в раздела за ацп-то и виж какво изходно съпротивление максимално можеш да сложиш. По принцип (като правило) между 5 и 10 килоома максимум. Ако си сложил 100к е нормално да не мери вярно. Някой от по-новите пикове имат буфер на входа и позволяват по високи съпротивления.


Вто Юли 16, 2013 5:11 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 04, 2012 1:51 pm
Мнения: 44
Местоположение: София
Мнение Re: С-заяк търси помощ
10 килоома.

_________________
Бай Цветан


Вто Юли 16, 2013 6:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Авг 23, 2005 12:02 pm
Мнения: 3070
Местоположение: София
Мнение Re: С-заяк търси помощ
Другата причина е да не са нагласени времената на ADC-то. Погледни си в даташита спрямо честотата, на която си пуснал процесора какво Тad трябва да сложиш, и колко Тad периода да сложиш за четене преди да започне да преобразува.

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


Вто Юли 16, 2013 6:46 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: С-заяк търси помощ
Ами то за потенциометър с по-старите пикове може и с 1 мегаом да стане - като сметнеш колко време ще се зарежда кондензатора и си го задържаш толкова време включен към S/H схемата. Ама пък 2-3 килоома пот не е кой знае колко голям товар 2-3 милиампера не са кой знае кво ако не си на някво батерийно захранване дето се цедят микроамперите...


Вто Юли 16, 2013 6:55 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 04, 2012 1:51 pm
Мнения: 44
Местоположение: София
Мнение Re: С-заяк търси помощ
След няколкодневно зубрене на ADC работите се пооправиха и съоръжението работи. Остана само един проблем. ADRESH се вкарва в CPPR1L, за да се управлява DC. При промяна на DC се променя и амплитудата на PWM сигнала - намалява при увеличаване на DC до изчезване към 85%. Засега не мога да си обясня това, вероятно от неточна настройка на PWM регистрите.
Ще се учи още. Благодаря за съдействието.

_________________
Бай Цветан


Пет Юли 19, 2013 10:10 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение 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.


Пет Юли 19, 2013 10:35 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

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

_________________
Бай Цветан


Нед Юли 21, 2013 3:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: С-заяк търси помощ
Ами не знам какво разбираш под амплитуда? На изхода на PWM-а трябва да имаш 1-0 със някакво запълване. Това че размаха ти е 2 волта на него изход въобще не е нормално. АЦП-то ти може да се държи така странно ако го цъкаш много бързо и потенциометъра ти е голям - това за което говорихме по-горе. Там имаш кондензатор който трябва да се зареди. Всъщност всичките ти проблеми са хардуерни + непознаване на принципа на работа на двата модула АЦП и ПВМ. Прочети ги още няколко пъти в даташита и виж какво съм ти писал за ПВМ-а.

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


Нед Юли 21, 2013 3:34 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Юли 04, 2012 1:51 pm
Мнения: 44
Местоположение: София
Мнение Re: С-заяк търси помощ
Под малка амплитуда на сигнала разбирам това, че импулсите се движат от 0v за лог.нула до 2v за лог.1. По-нагоре не.
За това, че съм тъпак, си прав. Оказа се, че входа на ADC e запоен за съседното краче. Сега всичко прие нормален вид.
Благодаря за всичко. Край на темата.

_________________
Бай Цветан


Нед Юли 21, 2013 5:28 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 15 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни