Subversion Repositories HomeAutomation

Rev

Rev 1079 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
942 arune 1
 
954 runge 2
#include "act_RGBdriver.h"
1079 linlun 3
#define ALGO_FREQ       100
4
#define ADC_W   5
5
#define ADC_R   4
6
#define ADC_G   2
7
#define ADC_B   0
942 arune 8
 
1079 linlun 9
#define OCR_W   OCR1B
10
#define OCR_R   OCR1A
11
#define OCR_G   OCR0A
12
#define OCR_B   OCR0B
954 runge 13
 
1079 linlun 14
#define TARGET_CURRENT_W    250UL
15
#define TARGET_ADC_W        TARGET_CURRENT_W*4UL*1024UL/5000UL
954 runge 16
 
1079 linlun 17
#define TARGET_CURRENT_R    50UL
18
#define TARGET_ADC_R        TARGET_CURRENT_R*4UL*3UL*1024UL/5000UL
954 runge 19
 
1079 linlun 20
#define TARGET_CURRENT_G    50UL
21
#define TARGET_ADC_G        TARGET_CURRENT_G*4UL*3UL*1024UL/5000UL
22
 
23
#define TARGET_CURRENT_B    50UL
24
#define TARGET_ADC_B        TARGET_CURRENT_B*4UL*3UL*1024UL/5000UL
25
 
954 runge 26
/*
27
 
28
50mA*0.1R = 5mV
29
5mV*40ggr = 200mV
30
200mV*1024/5V = 41
31
 
32
50mA*0.1R = 5mV
33
5mV*40ggr = 200mV
34
50mA*0.1*40*1024/5 = 41
35
50mA*4*1024/5 = 41
36
*/
37
void calculatePWM(uint8_t timer) {
38
    uint16_t adcValue;
1079 linlun 39
    adcValue = ADC_Get(ADC_W);
954 runge 40
 
1079 linlun 41
    if (adcValue > TARGET_ADC_W+50)
42
        OCR_W=0;
43
    else if (adcValue > TARGET_ADC_W+16)
44
        OCR_W-=2;
45
    else if (adcValue < TARGET_ADC_W-5)
46
        OCR_W++;
47
    else if (adcValue > TARGET_ADC_W+5)
48
        OCR_W -=1;
954 runge 49
 
50
 
1079 linlun 51
    adcValue = ADC_Get(ADC_R);
954 runge 52
 
1079 linlun 53
    if (adcValue > TARGET_ADC_R+50)
54
        OCR_R=0;
55
    else if (adcValue > TARGET_ADC_R+16)
56
        OCR_R-=2;
57
    else if (adcValue < TARGET_ADC_R-5)
58
        OCR_R++;
59
    else if (adcValue > TARGET_ADC_R+5)
60
        OCR_R -=1;
954 runge 61
 
1079 linlun 62
    adcValue = ADC_Get(ADC_G);
954 runge 63
 
64
 
1079 linlun 65
    if (adcValue > TARGET_ADC_G+50)
66
        OCR_G=0;
67
    else if (adcValue > TARGET_ADC_G+16)
68
        OCR_G-=2;
69
    else if (adcValue < TARGET_ADC_G-5)
70
        OCR_G++;
71
    else if (adcValue > TARGET_ADC_G+5)
72
        OCR_G -=1;
954 runge 73
 
1079 linlun 74
    adcValue = ADC_Get(ADC_B);
954 runge 75
 
1079 linlun 76
    if (adcValue > TARGET_ADC_B+50)
77
        OCR_B=0;
78
    else if (adcValue > TARGET_ADC_B+16)
79
        OCR_B-=2;
80
    else if (adcValue < TARGET_ADC_B-5)
81
        OCR_B++;
82
    else if (adcValue > TARGET_ADC_B+5)
83
        OCR_B -=1;
954 runge 84
}
85
 
86
void sendADCvalue(uint8_t timer) {
87
    StdCan_Msg_t txMsg;
88
    StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
89
    StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
1079 linlun 90
    txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_RGBDRIVER;
954 runge 91
    txMsg.Header.ModuleId = act_RGBdriver_ID;
92
    txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_DEBUG;
93
    txMsg.Length = 6;
94
 
1079 linlun 95
 
954 runge 96
    //txMsg.Data[0] = (uint8_t)(ADC_Get(5)>>2);
1079 linlun 97
    txMsg.Data[0] = (uint8_t)(ADC_Get(ADC_W)&0xff);
954 runge 98
    txMsg.Data[1] = 0;
99
    txMsg.Data[2] = OCR1B;
1079 linlun 100
    txMsg.Data[3] = TARGET_ADC_R;
101
 
102
    txMsg.Data[4] = TARGET_CURRENT_W;
103
    txMsg.Data[5] = TARGET_ADC_W;
104
 
954 runge 105
    StdCan_Put(&txMsg);
106
}
107
 
942 arune 108
void act_RGBdriver_Init(void)
109
{
954 runge 110
    ADC_Init();
1079 linlun 111
 
942 arune 112
    //DDRB &= ~(1<<PB1);
1079 linlun 113
    //DDRB &= ~(1<<PB2);    //never set PB2 as input
954 runge 114
    TCCR1A = 0;
115
    TCCR1B = 0;
116
    TCCR1A |= (1 << WGM10) | (0 << WGM11);  //8-bit pwm with top=0xff
117
    TCCR1B |= (1 << WGM12);     //fast pwm
118
    cli();
119
    OCR1A = 0;  // set on time (tp)
120
    OCR1B = 0;  // set on time (tp)
121
    sei();
122
    DDRB |= _BV(PB2);           //set port to output
123
    TCCR1A |= (1<<COM1A1);      //enable output compare
124
    DDRB |= _BV(PB1);           //set port to output
125
    TCCR1A |= (1<<COM1B1);      //enable output compare
126
 
127
    //cli();
128
    //OCR1A = 10;  // set on time (tp)
129
    //OCR1B = 40;  // set on time (tp)
130
    //sei();
131
 
942 arune 132
    TCCR1B |= (1 << CS10);      //enable timer, prescaler=1
954 runge 133
 
134
 
942 arune 135
    // Contrast
136
    TCCR0A |= (1<<WGM01)|(1<<WGM00);
954 runge 137
    TCCR0B |= (1<<CS00);
138
    cli();
139
    OCR0A = 0;  // set on time (tp)
140
    OCR0B = 0;  // set on time (tp)
942 arune 141
    sei();
954 runge 142
    DDRD |= (1<<DDD5);
143
    DDRD |= (1<<DDD6);
942 arune 144
    TCCR0A |= (1<<COM0B1)|(1<<COM0A1);
954 runge 145
 
146
    Timer_SetTimeout(act_RGBdriver_ADC_SEND_TIMER, 2000, TimerTypeFreeRunning, sendADCvalue);
147
    Timer_SetTimeout(act_RGBdriver_REGULATOR_TIMER, ALGO_FREQ, TimerTypeFreeRunning, calculatePWM);
942 arune 148
}
149
 
150
void act_RGBdriver_Process(void)
151
{
152
    ///TODO: Stuff that needs doing is done here
153
}
154
 
155
void act_RGBdriver_HandleMessage(StdCan_Msg_t *rxMsg)
156
{
1079 linlun 157
    if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_ACT &&
954 runge 158
        StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER &&
1079 linlun 159
        rxMsg->Header.ModuleType == CAN_MODULE_TYPE_ACT_RGBDRIVER &&
942 arune 160
        rxMsg->Header.ModuleId == act_RGBdriver_ID)
161
    {
162
        switch (rxMsg->Header.Command)
163
        {
164
        case 0:
165
        ///TODO: Do something dummy
166
        break;
167
        }
168
    }
169
}
170
 
171
void act_RGBdriver_List(uint8_t ModuleSequenceNumber)
172
{
173
    StdCan_Msg_t txMsg;
1079 linlun 174
 
954 runge 175
    StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
176
    StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
177
    txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_RGBDRIVER;
942 arune 178
    txMsg.Header.ModuleId = act_RGBdriver_ID;
954 runge 179
    txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
942 arune 180
    txMsg.Length = 6;
181
 
1910 arune 182
    uint32_t HwId=BIOS_GetHwId();
183
    txMsg.Data[0] = HwId&0xff;
184
    txMsg.Data[1] = (HwId>>8)&0xff;
185
    txMsg.Data[2] = (HwId>>16)&0xff;
186
    txMsg.Data[3] = (HwId>>24)&0xff;
1079 linlun 187
 
942 arune 188
    txMsg.Data[4] = NUMBER_OF_MODULES;
189
    txMsg.Data[5] = ModuleSequenceNumber;
1079 linlun 190
 
967 runge 191
    while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
942 arune 192
}