贴一个我的代码给大家
电路有市电 过零点检测
每次过零 启动150us的 TIMER1_ISR 中断 在3750 us开始,每隔150us采集一次市电的 ADC 以检测用的市电是110v还是220V 同时检测一个0.1R的ADC ,市电的 ADC *16 /0.R的ADC 连续采样10次 去掉最大值和最小值。
void TIMER1_ISR (void) interrupt 3 //using 1
{
//150us
//GPIO2 ^= BIT3;//GPIO19
//GPIO0 ^= BIT2;
//++electrical_level_timer;//t2_count2
switch(++electrical_level_timer)
{
case 1:
TRIAC_OFF;//bidirectional triode thyristor
break;
case 24:
electric_supply_0p1R_adc_max = 0x0000;
electric_supply_0p1R_adc_min = 0xFFFF;
electric_supply_0p1R_adc_sum = 0x0000;
break;
case 25://150*25=3750
case 26://150*26=3900
case 27://150*27=4050
case 28://150*28=4200
case 29://150*29=4350
case 30://150*30=4500
case 31://150*31=4650
case 32://150*32=4800
case 33://150*33=4950
electric_supply_voltage_adc = ADC1_GetConversionValue(2);//adc 220v or 110v
electric_supply_voltage_adc = (electric_supply_voltage_adc << 4);
electric_0p1R_adc = ADC1_GetConversionValue(0);//0.1R
electric_supply_0p1R_adc = (electric_supply_voltage_adc) / electric_0p1R_adc;
if(electric_supply_0p1R_adc_max < electric_supply_0p1R_adc)
{
electric_supply_0p1R_adc_max = electric_supply_0p1R_adc;
}
else if(electric_supply_0p1R_adc_min > electric_supply_0p1R_adc)
{
electric_supply_0p1R_adc_min = electric_supply_0p1R_adc;
}
electric_supply_0p1R_adc_sum += electric_supply_0p1R_adc;
#if 0
Debug_UartSendByte(0x55);
Debug_UartSendByte(electric_supply_voltage_adc >> 8);
Debug_UartSendByte((u8_t)electric_supply_voltage_adc);
Debug_UartSendByte(0x56);
Debug_UartSendByte(electric_0p1R_adc >> 8);
Debug_UartSendByte((u8_t)electric_0p1R_adc);
#endif
Debug_UartSendByte(0x5A);
Debug_UartSendByte(electric_supply_0p1R_adc >> 8);
Debug_UartSendByte((u8_t)electric_supply_0p1R_adc);
Debug_UartSendByte(0xA5);
Debug_UartSendByte(electric_supply_0p1R_adc_sum >> 8);
Debug_UartSendByte((u8_t)electric_supply_0p1R_adc_sum);
break;
case 34://150*34=5100us
electric_supply_voltage_adc = ADC1_GetConversionValue(2);//adc 220v or 110v
electric_supply_voltage_adc = (electric_supply_voltage_adc << 4);
electric_0p1R_adc = ADC1_GetConversionValue(0);//0.1R
electric_supply_0p1R_adc = (electric_supply_voltage_adc) / electric_0p1R_adc;
if(electric_supply_0p1R_adc_max < electric_supply_0p1R_adc)
{
electric_supply_0p1R_adc_sum -= electric_supply_0p1R_adc_min;
electric_supply_0p1R_adc_max = electric_supply_0p1R_adc;
}
else if(electric_supply_0p1R_adc_min > electric_supply_0p1R_adc)
{
electric_supply_0p1R_adc_sum -= electric_supply_0p1R_adc_max;
electric_supply_0p1R_adc_min = electric_supply_0p1R_adc;
}
else
{
electric_supply_0p1R_adc_sum -= electric_supply_0p1R_adc_min;
electric_supply_0p1R_adc_sum -= electric_supply_0p1R_adc_max;
electric_supply_0p1R_adc_sum += electric_supply_0p1R_adc;
}
//3.3ms
TF1 = 0;
TR1 = 0; //disable T1
ET1 = 0;
Debug_UartSendByte(0x5A);
Debug_UartSendByte(electric_supply_0p1R_adc >> 8);
Debug_UartSendByte((u8_t)electric_supply_0p1R_adc);
Debug_UartSendByte(0xA5);
Debug_UartSendByte(electric_supply_0p1R_adc_sum >> 8);
Debug_UartSendByte((u8_t)electric_supply_0p1R_adc_sum);
Debug_UartSendByte(0x8A);
Debug_UartSendByte(electric_supply_0p1R_adc_min >> 8);
Debug_UartSendByte((u8_t)electric_supply_0p1R_adc_min);
Debug_UartSendByte(0x9A);
Debug_UartSendByte(electric_supply_0p1R_adc_max >> 8);
Debug_UartSendByte((u8_t)electric_supply_0p1R_adc_max);
Debug_UartSendByte(0xAA);
Debug_UartSendByte(electric_supply_0p1R_adc_sum >> 8);
Debug_UartSendByte((u8_t)electric_supply_0p1R_adc_sum);
electrical_level_timer = 0;
break;
default:
break;
}
}