Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

ADC using microC PRO for dsPIC33

Status
Not open for further replies.

zaera

Newbie level 2
Joined
Feb 24, 2017
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
43
Hi,

I'm a new here. I have a problem with my experiment. In my experiment, I have four capacitors are connected to converter. I need to balance all the capacitor voltage by controlling the four switches inside the converter. For example, if i supply Vdc=40V, so every capacitor will get 10V. I'm using if else statement to determine which switches will be ON or OFF depends on their capacitor voltage. But when i run the experiment, it only executes one statement all the time although the capacitor voltage change so that if-else statement also need to change. Is there any wrong with my programming. Anyone can help me?


Code C - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// dsPIC33FJ128MC202, development board Easy 24-33 v6
// microC PRO
// Use ADC library function
// Oscillator mode= Internal FRC
//MCU clock frequency = 7.37 MHz
//sw: microC PRO for dsPIC33
 
#include <built_in.h>
 
unsigned C1,C2,C3,C4,Vc1,Vc2,Vc3,Vc4,RawData1,RawData2,RawData3,RawData4;
signed e1,e2;
 
void main()
{
 
AD1PCFGL=0xFFF0; //Set PCFG0,PCFG1,PCFG2,PCF3 as analog input
TRISA0_bit=1; //PORTA0 is input 1(AN0)
TRISA1_bit=1; //PORTA1 is input 2 (AN1)
TRISB0_bit=1; //PORTB0 is input 3 (AN2)
TRISB1_bit=1; //PORTB1 is input 4 (AN3)
 
TRISB12_bit=0; // PORTB12 is output as switch 1 (S1)
TRISB13_bit=0; // PORTB13 is output as switch 2 (S2)
TRISB14_bit=0; // PORTB14 is output as switch 3 (S3)
TRISB15_bit=0; // PORTB15 is output as switch 4 (S4)
 
TRISB6_bit=0; //PORTB6 to display the frequency
 
LATBbits.LATB12=0; //Initialize PortB12
LATBbits.LATB13=0; //Initialize PortB13
LATBbits.LATB14=0; //Initialize PortB14
LATBbits.LATB15=0; //Initialize PortB15
LATBbits.LATB6=0; //Initialize PortB6
 
ADC1_Init(); //Initialize ADC module
 
while (1)
{
C1= (ADC1_Read(0)/0x3FF)*3.30; //Read capacitor voltage 1 from voltage sensor 1
C2= (ADC1_Read(1)/0x3FF)*3.30; //Read Vc2
C3= (ADC1_Read(2)/0x3FF)*3.30; //Read Vc3
C4= (ADC1_Read(3)/0x3FF)*3.30; //Read Vc3
 
RawData1= (C1 - 1.256);
Vc1= RawData1 * 128.42; //Actual value of capacitor voltage 1
 
RawData2= (C2 - 1.257);
Vc2= RawData2 * 267.68; //Actual value of capacitor voltage 2
 
RawData3= (C3 - 1.257);
Vc3= RawData3 * 297.14; //Actual value of capacitor voltage 3
 
RawData4= (C4 + 0.013);
Vc4= RawData4 * 100.92; //Actual value of capacitor voltage 4
 
e1= Vc1-Vc2; //error voltage 1
e2= Vc4-Vc3; //error voltage 2
 
LATBbits.LATB6=~LATBbits.LATB6; //Connect to oscilloscope to read the frequency
 
if ( (e1>=0.01) && (e2>=0.01))
{
LATBbits.LATB12=1; //S1
LATBbits.LATB13=0; //S2
LATBbits.LATB14=0; //S3
LATBbits.LATB15=1; //S4
}
else if ( (e1>=0.01) && (e2 < 0.01))
{
LATBbits.LATB12=1; //S1
LATBbits.LATB13=0; //S2
LATBbits.LATB14=1; //S3
LATBbits.LATB15=0; //S4
}
else if ( (e1<0.01) && (e2 >=0.01) )
{
LATBbits.LATB12=0; //S1
LATBbits.LATB13=1; //S2
LATBbits.LATB14=0; //S3
LATBbits.LATB15=1; //S4
}
 
else
{
LATBbits.LATB12=0; //S1
LATBbits.LATB13=1; //S2
LATBbits.LATB14=1; //S3
LATBbits.LATB15=0; //S4
}
 
delay_ms(100);
}
 
}





Sorry for my poor english.

Thanks. :)
 
Last edited by a moderator:

Code:
C1= (ADC1_Read(0)/0x3FF)*3.30; //Read capacitor voltage 1 from voltage sensor 1
C2= (ADC1_Read(1)/0x3FF)*3.30; //Read Vc2
C3= (ADC1_Read(2)/0x3FF)*3.30; //Read Vc3
C4= (ADC1_Read(3)/0x3FF)*3.30; //Read Vc3

should be

C1= (ADC1_Read(0) * 3.3 / 0x3FF)
C2= (ADC1_Read(1) * 3.3 / 0x3FF)
C3= (ADC1_Read(2) * 3.3 / 0x3FF)
C4= (ADC1_Read(3) * 3.3 / 0x3FF)

It is better to use double type for the variables.

- - - Updated - - -

Code:
C1= (ADC1_Read(0)/0x3FF)*3.30; //Read capacitor voltage 1 from voltage sensor 1
C2= (ADC1_Read(1)/0x3FF)*3.30; //Read Vc2
C3= (ADC1_Read(2)/0x3FF)*3.30; //Read Vc3
C4= (ADC1_Read(3)/0x3FF)*3.30; //Read Vc3

should be

C1= (ADC1_Read(0) * 3.3 / 0x3FF)
C2= (ADC1_Read(1) * 3.3 / 0x3FF)
C3= (ADC1_Read(2) * 3.3 / 0x3FF)
C4= (ADC1_Read(3) * 3.3 / 0x3FF)

It is better to use double type for the variables.
 

Thanks Okada. But my experiment still not working. I check the switches,only switches no.2 and 3 are ON. I like to ask, for the function ADC_Read(0) until ADC_Read (3), how it read,simultaneously or sequentially?

Anyone can help me?
 

Make all variables double otherwise it will not work.
 

Hello,
try to put some delay between the instructions ADC1_Read(x). Maybe there is not enough time to read the adc and that is the reason you are not reading all values.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top