Subversion Repositories HomeAutomation

Rev

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

  1.  
  2. #include "act_RGBdriver.h"
  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
  8.  
  9. #define OCR_W   OCR1B
  10. #define OCR_R   OCR1A
  11. #define OCR_G   OCR0A
  12. #define OCR_B   OCR0B
  13.  
  14. #define TARGET_CURRENT_W    250UL
  15. #define TARGET_ADC_W        TARGET_CURRENT_W*4UL*1024UL/5000UL
  16.  
  17. #define TARGET_CURRENT_R    50UL
  18. #define TARGET_ADC_R        TARGET_CURRENT_R*4UL*3UL*1024UL/5000UL
  19.  
  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.  
  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;
  39.     adcValue = ADC_Get(ADC_W);
  40.  
  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;
  49.  
  50.  
  51.     adcValue = ADC_Get(ADC_R);
  52.  
  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;
  61.  
  62.     adcValue = ADC_Get(ADC_G);
  63.  
  64.  
  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;
  73.  
  74.     adcValue = ADC_Get(ADC_B);
  75.  
  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;
  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);
  90.     txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_RGBDRIVER;
  91.     txMsg.Header.ModuleId = act_RGBdriver_ID;
  92.     txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_DEBUG;
  93.     txMsg.Length = 6;
  94.  
  95.  
  96.     //txMsg.Data[0] = (uint8_t)(ADC_Get(5)>>2);
  97.     txMsg.Data[0] = (uint8_t)(ADC_Get(ADC_W)&0xff);
  98.     txMsg.Data[1] = 0;
  99.     txMsg.Data[2] = OCR1B;
  100.     txMsg.Data[3] = TARGET_ADC_R;
  101.  
  102.     txMsg.Data[4] = TARGET_CURRENT_W;
  103.     txMsg.Data[5] = TARGET_ADC_W;
  104.  
  105.     StdCan_Put(&txMsg);
  106. }
  107.  
  108. void act_RGBdriver_Init(void)
  109. {
  110.     ADC_Init();
  111.  
  112.     //DDRB &= ~(1<<PB1);
  113.     //DDRB &= ~(1<<PB2);    //never set PB2 as input
  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.  
  132.     TCCR1B |= (1 << CS10);      //enable timer, prescaler=1
  133.  
  134.  
  135.     // Contrast
  136.     TCCR0A |= (1<<WGM01)|(1<<WGM00);
  137.     TCCR0B |= (1<<CS00);
  138.     cli();
  139.     OCR0A = 0;  // set on time (tp)
  140.     OCR0B = 0;  // set on time (tp)
  141.     sei();
  142.     DDRD |= (1<<DDD5);
  143.     DDRD |= (1<<DDD6);
  144.     TCCR0A |= (1<<COM0B1)|(1<<COM0A1);
  145.  
  146.     Timer_SetTimeout(act_RGBdriver_ADC_SEND_TIMER, 2000, TimerTypeFreeRunning, sendADCvalue);
  147.     Timer_SetTimeout(act_RGBdriver_REGULATOR_TIMER, ALGO_FREQ, TimerTypeFreeRunning, calculatePWM);
  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. {
  157.     if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_ACT &&
  158.         StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER &&
  159.         rxMsg->Header.ModuleType == CAN_MODULE_TYPE_ACT_RGBDRIVER &&
  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;
  174.  
  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;
  178.     txMsg.Header.ModuleId = act_RGBdriver_ID;
  179.     txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
  180.     txMsg.Length = 6;
  181.  
  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;
  187.  
  188.     txMsg.Data[4] = NUMBER_OF_MODULES;
  189.     txMsg.Data[5] = ModuleSequenceNumber;
  190.  
  191.     while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  192. }
  193.