111 #define NUMBER_OF_SAMPLES_TO_COUNT 6000000
113 IRPyro_sensor_device_type IRPyro_Sensor =
120 .number_of_active_channels = 1,
124 AFE_reg_type IRPyro_Sensor_AFE =
127 .LP = LOW_POWER_DISABLE,
129 .C_LP = LOW_PASS_180,
130 .CLK_OUT = CLK_DISABLE,
132 .TEMP = TEMP_DISABLE,
136 CCP_reg_type IRPyro_Sensor_Ch_Cfg =
138 .Feedback_cap = FEEDBACK_3200_1280,
139 .High_pass_filter_setting = HIGH_PASS_1HZ,
140 .Feedback_transconductance = TCONDUCT_0_15T,
141 .status_bit = CH_ENABLE
144 WUP_reg_type IRPyro_Sensor_WUP_Cfg =
146 .UHT = MAX_WUP_THRESHOLD,
147 .ULT = SAFE_WUP_THRESHOLD,
148 .LHT = MIN_WUP_THRESHOLD,
149 .LLT = MIN_WUP_THRESHOLD,
150 .WT_Threshold = DEFAULT_NO_EVENTS,
151 .DP0_DP2 = NOT_IN_USE_VALUE,
153 .ST = SLEEP_MODE_ONE_CH
156 IRPyro_Sensor.AFE_register = IRPyro_Sensor_AFE;
157 IRPyro_Sensor.CCP_register[2] = IRPyro_Sensor_Ch_Cfg;
158 IRPyro_Sensor.WUP_register = IRPyro_Sensor_WUP_Cfg;
161 Micro_controller_template_init();
167 IRPyro_open(&IRPyro_Sensor);
174 IRPyro_read(&IRPyro_Sensor);
176 UART_stream_char_send(IRPyro_Sensor.channel_value, IRPyro_Sensor.channel_saturation_byte);
182 IRPyro_close(&IRPyro_Sensor);
202 #define NUMBER_OF_FRAMES_TO_COUNT 3 // change to the desired number
203 #define IRPyro_FRAME_COUNT_LOCATION 5 // position on the user data buffer
204 uint16_t sample_counter = 0;
210 if(this_device->AFE_register.C_LP)
212 read_delay = (this_device->AFE_register.S7_S0 +1)*6;
216 read_delay = this_device->AFE_register.S7_S0 +1;
218 IRPyro_read(this_device);
221 Micro_controller_delay_ms(read_delay);
222 if (IRPyro_read(this_device))
225 UART_stream_char_send(this_device->channel_value, this_device->channel_saturation_byte);
261 #define IRPyro_MAXINT 2147483647
264 IRPyro_devices IRPyro_device = {0};
268 AFE_reg_type IRPyro_AFE_Master =
271 .LP = LOW_POWER_DISABLE,
273 .C_LP = LOW_PASS_180,
274 .CLK_OUT = CLK_DISABLE,
276 .TEMP = TEMP_DISABLE,
280 CCP_reg_type IRPyro_Ch_Cfg =
282 .Feedback_cap = FEEDBACK_200_80,
283 .High_pass_filter_setting = HIGH_PASS_1HZ,
284 .Feedback_transconductance = TCONDUCT_1_2T,
285 .status_bit = CH_ENABLE
288 WUP_reg_type IRPyro_WUP_Cfg =
290 .UHT = MAX_WUP_THRESHOLD,
291 .ULT = SAFE_WUP_THRESHOLD,
292 .LHT = MIN_WUP_THRESHOLD,
293 .LLT = MIN_WUP_THRESHOLD,
294 .WT_Threshold = DEFAULT_NO_EVENTS,
295 .DP0_DP2 = NOT_IN_USE_VALUE,
297 .ST = SLEEP_MODE_ONE_CH
299 uint8_t num_of_IRPyro_on_demo_board = 3;
302 IRPyro_device[0].INT_Port = 1;
303 IRPyro_device[0].CS_Port = 2;
304 IRPyro_device[0].CS_Pin = 1;
305 IRPyro_device[0].INT_Pin = 4;
306 IRPyro_device[0].address = 0x70;
308 IRPyro_device[1].CS_Port = 2;
309 IRPyro_device[1].INT_Port = 1;
310 IRPyro_device[1].CS_Pin = 5;
311 IRPyro_device[1].INT_Pin = 5;
312 IRPyro_device[1].address = 0x69;
314 IRPyro_device[2].CS_Port = 2;
315 IRPyro_device[2].INT_Port = 1;
316 IRPyro_device[2].CS_Pin = 4;
317 IRPyro_device[2].INT_Pin = 6;
318 IRPyro_device[2].address = 0x68;
321 IRPyro_device[0].number_of_active_channels = 1;
322 IRPyro_device[0].read_mode = 1;
323 IRPyro_device[0].AFE_register = IRPyro_AFE_Master;
324 IRPyro_device[0].CCP_register[2] = IRPyro_Ch_Cfg;
325 IRPyro_device[0].WUP_register = IRPyro_WUP_Cfg;
327 IRPyro_device[1].number_of_active_channels = 1;
328 IRPyro_device[1].read_mode = 1;
329 IRPyro_device[1].AFE_register = IRPyro_AFE_Master;
330 IRPyro_device[1].CCP_register[2] = IRPyro_Ch_Cfg;
331 IRPyro_device[1].WUP_register = IRPyro_WUP_Cfg;
333 IRPyro_device[2].number_of_active_channels = 1;
334 IRPyro_device[2].read_mode = 1;
335 IRPyro_device[2].AFE_register = IRPyro_AFE_Master;
336 IRPyro_device[2].CCP_register[2] = IRPyro_Ch_Cfg;
337 IRPyro_device[2].WUP_register = IRPyro_WUP_Cfg;
340 Micro_controller_template_init();
348 IRPyro_open_devices(IRPyro_device, num_of_IRPyro_on_demo_board);
352 IRPyro_read_devices(IRPyro_device, num_of_IRPyro_on_demo_board);
353 for(
int i=0; i<3 ; ++i)
355 UART_PutString(USART2, (uint8_t*)
"SENSOR:");
356 UART_PutNumber(USART2, (uint32_t)i);
357 UART_PutString(USART2, (uint8_t*)
" , ");
358 UART_stream_char_send(IRPyro_device[i].channel_value, IRPyro_device[i].channel_saturation_byte);
363 IRPyro_close_devices(IRPyro_device, 4);
390 IRPyro_sensor_device_type IRPyro_Sensor =
397 .number_of_active_channels = 1,
401 AFE_reg_type IRPyro_AFE_Single =
404 .LP = LOW_POWER_DISABLE,
406 .C_LP = LOW_PASS_180,
407 .CLK_OUT = CLK_DISABLE,
409 .TEMP = TEMP_DISABLE,
412 CCP_reg_type IRPyro_Ch_Cfg =
414 .Feedback_cap = FEEDBACK_3200_1280,
415 .High_pass_filter_setting = HIGH_PASS_1HZ,
416 .Feedback_transconductance = TCONDUCT_0_15T,
417 .status_bit = CH_ENABLE
421 IRPyro_Sensor.AFE_register = IRPyro_AFE_Single;
422 IRPyro_Sensor.CCP_register[2] = IRPyro_Ch_Cfg;
423 IRPyro_cmd_type IOCTL_cmd = {0};
424 IRPyro_arg_type IOCTL_arg = {0};
426 Micro_controller_template_init();
432 IRPyro_open(&IRPyro_Sensor);
434 IOCTL_cmd.cmd = sampling_rate_get;
435 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
438 IOCTL_cmd.cmd = sampling_rate_set;
439 IOCTL_arg.arg = 0x0A;
440 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
443 IOCTL_cmd.cmd = sampling_rate_set;
444 IOCTL_arg.arg = 0x00;
445 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
448 IOCTL_cmd.cmd = high_pass_set;
449 IOCTL_arg.arg = HIGH_PASS_2HZ;
450 IOCTL_arg.channel = 1;
451 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
454 IOCTL_cmd.cmd = high_pass_get;
455 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
458 IOCTL_cmd.cmd = high_pass_set;
459 IOCTL_arg.arg = HIGH_PASS_8HZ;
460 IOCTL_arg.channel = 2;
461 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
464 IOCTL_cmd.cmd = high_pass_get;
467 IOCTL_cmd.cmd = low_pass_set;
468 IOCTL_arg.arg = LOW_PASS_45;
469 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
472 IOCTL_cmd.cmd = low_pass_get;
473 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
476 IOCTL_cmd.cmd = gain_set;
477 IOCTL_arg.arg = GAIN_08;
478 IOCTL_arg.channel = 3;
479 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
482 IOCTL_cmd.cmd = gain_get;
483 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
486 IOCTL_cmd.cmd = gain_set;
487 IOCTL_arg.arg = GAIN_16;
488 IOCTL_arg.channel = 4;
489 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
492 IOCTL_cmd.cmd = power_normal;
493 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
496 IOCTL_cmd.cmd = power_low;
497 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
500 IOCTL_cmd.cmd = power_sleep;
501 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
503 IOCTL_cmd.cmd = power_wakeup;
504 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
506 IOCTL_cmd.cmd = power_off;
507 IRPyro_ioctl(&IRPyro_Sensor, &IOCTL_cmd, IOCTL_arg);
509 IRPyro_close(&IRPyro_Sensor);
540 #define TIME_TO_WAIT 600000
542 IRPyro_sensor_device_type IRPyro_single_sensor = {0};
544 uint8_t wake_up_detected = 0;
545 IRPyro_cmd_type IOCTL_cmd = {0};
546 IRPyro_arg_type IOCTL_arg = {0};
549 IRPyro_single_sensor.CS_Port = 2;
550 IRPyro_single_sensor.CS_Pin = 1;
551 IRPyro_single_sensor.INT_Port = 1;
552 IRPyro_single_sensor.INT_Pin = 4;
554 IRPyro_single_sensor.read_mode = 1;
555 IRPyro_single_sensor.address = 0x08;
556 IRPyro_single_sensor.number_of_active_channels = 1;
558 IRPyro_single_sensor.WUP_register.UHT = MAX_WUP_THRESHOLD;
559 IRPyro_single_sensor.WUP_register.ULT = SAFE_WUP_THRESHOLD;
560 IRPyro_single_sensor.WUP_register.LHT = MIN_WUP_THRESHOLD;
561 IRPyro_single_sensor.WUP_register.LLT = MIN_WUP_THRESHOLD;
562 IRPyro_single_sensor.WUP_register.WT_Threshold = DEFAULT_NO_EVENTS;
563 IRPyro_single_sensor.WUP_register.DP0_DP2 = NOT_IN_USE_VALUE;
564 IRPyro_single_sensor.WUP_register.CH0_CH2 = SEL_CH_2;
565 IRPyro_single_sensor.WUP_register.ST = SLEEP_MODE_ONE_CH;
567 Micro_controller_template_init();
573 UART_PutString(USART2, (uint8_t*)
"15 Configure sensor WAKE UP EVENT, SEND TO SLEEP, DETECT WAKE UP \n");
574 IRPyro_open(&IRPyro_single_sensor);
575 UART_PutString(USART2, (uint8_t*)
"WAKE UP EVENT DETECTION BY HARDWARE INTERRUPT \n");
578 UART_PutString(USART2, (uint8_t*)
"SET IRPyro ON POWER NORMAL \n");
579 IOCTL_cmd.cmd = power_normal;
580 IRPyro_ioctl(&IRPyro_single_sensor, &IOCTL_cmd, IOCTL_arg);
583 UART_PutString(USART2, (uint8_t*)
"SET IRPyro ON POWER SLEEP \n");
584 IOCTL_cmd.cmd = power_sleep;
585 IRPyro_ioctl(&IRPyro_single_sensor, &IOCTL_cmd, IOCTL_arg);
588 UART_PutString(USART2, (uint8_t*)
"SEND MCU TO SLEEP \n");
589 UART_PutString(USART2, (uint8_t*)
"WAIT FOR IRPyro TO WAKE MCU \n");
594 PWR_EnterSleepMode(PWR_SLEEPEntry_WFI);
599 wake_up_detected = EXTI_detected(0);
602 while ((time_to_wait != 0) && (wake_up_detected == 0));
604 if (time_to_wait == 0 && wake_up_detected == 0)
606 IOCTL_cmd.cmd = power_wakeup;
607 UART_PutString(USART2, (uint8_t*)
"FORCED POWER WAKE UP \n");
608 IRPyro_ioctl(&IRPyro_single_sensor, &IOCTL_cmd, IOCTL_arg);
609 UART_PutString(USART2, (uint8_t*)
"READ TEST AFTER FORCED POWER WAKE UP \n");
614 UART_PutString(USART2, (uint8_t*)
"WAKE UP EVENT DETECTED!! \n");
615 UART_PutString(USART2, (uint8_t*)
"READ TEST AFTER WAKE UP EVENT \n");
619 IRPyro_close(&IRPyro_single_sensor);
621 UART_PutString(USART2, (uint8_t*)
"============\n");
622 UART_PutString(USART2, (uint8_t*)
"--------------WAKE UP EVENT DETECTION BY HARDWARE INTERRUPT-------------------------\n");
636 uint8_t uart_byte = (uint8_t)USART_ReceiveData(USART2);
653 uint8_t num_of_IRPyro = *list_size;
654 uint8_t devices_present =0;
655 for(uint8_t current=0 ; current < num_of_IRPyro; ++ current)
657 if (IRPyro_open(&this_list[current]) == 1)
662 *list_size = devices_present;
670 CS_pin_set(2,1,state);
671 CS_pin_set(2,3,state);
672 CS_pin_set(2,4,state);
673 CS_pin_set(2,5,state);
682 Micro_controller_delay_ms(30);
684 Micro_controller_delay_ms(30);