ãŸããäžè¬ã«ã€ããŠè§ŠããŠããã詳现ã«é²ã¿ãŸãã
ãã®ããããã¬ããããŒãã¢ãã«ïŒãŸãã¯å®æããããã€ã¹-æºåãã§ãããïŒã«å ããŠãJTAGã¢ããã¿ãŒãå¿ èŠã«ãªããŸãã ç§ã®å Žåãããã¯ST-LINK / V2ã§ãã ãã¡ãããIronã§ã¯ååã§ã¯ãããŸãããã³ãŒããäœããã®æ¹æ³ã§ã³ã³ãã€ã«ããã³ã³ãããŒã©ãŒã«ã¢ããããŒãããå¿ èŠããããŸãã ãã®ããã«ãARMçšgccã³ã³ãã€ã©ãŒïŒarm-none-eabiïŒããã³ST-LINKãæäœããããã®ãŠãŒãã£ãªãã£ãŒïŒstlinkãšåŒã°ããïŒãã€ã³ã¹ããŒã«ãããŸããã
ãµã³ãã«ãšããŠã ãã®ãããžã§ã¯ããåãäžããŸãã ã ããããç°¡åãªãã¢ãããžã§ã¯ããããŠã³ããŒãããæãç°¡åãªãã®ãã³ã³ãã€ã«ããããšããŸããã ãããŠãæåã¯MKã®æšæºHelloworldã§ããïŒLEDã®ç¹æ» ã
ç§ã¯æåããåºäŒã£ãã¬ãŒããããã«èšããªããã°ãªããŸããïŒobjcopyãå¿ããŠããŸããŸããã ãããžã§ã¯ããã³ã³ãã€ã«ããããå¿ ããã®ãŠãŒãã£ãªãã£ã䜿çšããŠãã€ããªãäœæããå¿ èŠããããŸãã ãããŠãMakefilesããç解ã§ããªãïŒãããŠäžèŠäžå¿ èŠã«æããïŒç®æšãæšãŠãªãã§ãã ããã
䟿å©ãªIDEãšããŠãGeanyã䜿çšããŸãã ç§ã¯ä»äºã§2å°ã®ã¢ãã¿ãŒãæã£ãŠããã®ã§ããšãŠã䟿å©ã§ãã1å°ã®ã¢ãã¿ãŒã§ã¯ã³ãŒãã§GeanyãéããŠããããã1å°ã§ã¯makeãšcomïŒtinyserialããã®ã¿ãŒããã«ïŒãå®è¡ããã¿ãŒããã«ã§ãã
Makefileå šäœãæ€èšããã®ã§ã¯ãªããMakefileã§äœãå€æŽãã¹ããã«ã®ã¿æ³šæãæããŸãã
ã³ãŒã
BIN=testproject ⊠STM32_LIBSRC+=stm32_lib/misc.c STM32_LIBSRC+=stm32_lib/stm32f10x_adc.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_bkp.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_can.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_cec.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_crc.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_dac.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_dbgmcu.c STM32_LIBSRC+=stm32_lib/stm32f10x_dma.c STM32_LIBSRC+=stm32_lib/stm32f10x_exti.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_flash.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_fsmc.c STM32_LIBSRC+=stm32_lib/stm32f10x_gpio.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_i2c.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_it.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_iwdg.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_pwr.c STM32_LIBSRC+=stm32_lib/stm32f10x_rcc.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_rtc.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_sdio.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_spi.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_tim.c STM32_LIBSRC+=stm32_lib/stm32f10x_usart.c #~ STM32_LIBSRC+=stm32_lib/stm32f10x_wwdg.c ⊠SRC=hw_config.c main.c leds.c interrupts.c usb_desc.c usb_istr.c \ usb_prop.c usb_pwr.c onewire.c ⊠#~ OBJ+=stm32f10x_bkp.o #~ OBJ+=stm32f10x_can.o #~ OBJ+=stm32f10x_cec.o #~ OBJ+=stm32f10x_crc.o #~ OBJ+=stm32f10x_dac.o #~ OBJ+=stm32f10x_dbgmcu.o OBJ+=stm32f10x_dma.o OBJ+=stm32f10x_exti.o #~ OBJ+=stm32f10x_flash.o #~ OBJ+=stm32f10x_fsmc.o OBJ+=stm32f10x_gpio.o #~ OBJ+=stm32f10x_i2c.o #~ OBJ+=stm32f10x_it.o #~ OBJ+=stm32f10x_iwdg.o #~ OBJ+=stm32f10x_pwr.o OBJ+=stm32f10x_rcc.o #~ OBJ+=stm32f10x_rtc.o #~ OBJ+=stm32f10x_sdio.o #~ OBJ+=stm32f10x_spi.o #~ OBJ+=stm32f10x_tim.o OBJ+=stm32f10x_usart.o #~ OBJ+=stm32f10x_wwdg.o
- BIN-ã³ã³ãã€ã«åŸã®çµæã®ãã€ããªã®åå
- STM32_LIBSRCããã³OBJã«ã¯STDPeriphLibã©ã€ãã©ãªãã©ã°ã€ã³ãå«ãŸããŠããŸããæªäœ¿çšã®ãã®ã¯ã³ã¡ã³ãåããå¿ èŠããããŸã
- SRCã«ã¯ãŠãŒã¶ãŒãœãŒã¹ã®ãªã¹ããå«ãŸããŠããŸã
ã³ãŒããäœæããããmakeãå®è¡ããŸãã ãã¹ãŠãæ£åžžãªå Žåã$ïŒBINïŒ.binãã¡ã€ã«ãçŸåšã®ãã£ã¬ã¯ããªã«è¡šç€ºãããŸãããã®ãã¡ã€ã«ãUSBãã©ãã·ã¥ãã©ã€ãã«æžã蟌ãå¿ èŠããããŸãã èšé²ã¯make loadã䜿çšããŠè¡ãããŸãããã®ãã«ãã¿ãŒã²ããã¯ãst-flashãåŒã³åºããŠãã€ã¯ãã³ã³ãããŒã©ãŒããã©ãã·ã¥ããã ãã§ãã
USB
ãã®ããããŸããã³ã³ãã¥ãŒã¿ãŒãšPCã®éã«æ¥ç¶ã確ç«ããå¿ èŠããããŸãã RS-232ãçŸä»£ã®ã³ã³ãã¥ãŒã¿ãŒã«ãªãããšãèæ ®ããŠãUSBãä»ãããããã°éä¿¡ãæé ããŸãã ãã ãããæŠéç¶æ ãã§ã¯ãMKshkaã¯å¥ã®ã³ã³ãããŒã©ãŒããRS-232ã³ãã³ããåä¿¡ãããããUSB <-> RS-232ã¢ããã¿ãŒãšãã¥ã¬ãŒã¿ãŒãæŽçããæ¹åãããã«ç¢ºèªããããšã«ããŸããã ãã®ã¢ãããŒãã¯ãUSBçµç±ã§ããã€ã¹ãšããåãããããã«äœåãªã³ãŒããæ°ã«ããå¿ èŠããªããã䟿å©ã§ãïŒãã ããããã¯åºæ¬çã§ãããé¢åã§ãïŒïŒã ã¯ãããããã°ã¯ç°¡åã§ããä»»æã®ã·ãªã¢ã«ç«¯æ«ãšãã¥ã¬ãŒã¿ã䜿çšããŠã·ãªã¢ã«ããŒããšããŠããã€ã¹/ dev / ttyACM0ãéãããéä¿¡ãããŸãã ã¯ããæåã¯ã¿ãŒããã«ãšãã¥ã¬ãŒã¿ãšããŠïŒãããŸã§ã®ãšããã³ã³ãã¥ãŒã¿ãŒåŽã«ãœãããŠã§ã¢ã¯ãããŸããïŒç§ã¯tinyserialã䜿çšããŸããã
ãããã ããšãã¥ã¬ãŒã¿ã¢ããã¿USB <-> RS-232ã®ã³ãŒããããŠã³ããŒãããŸããã 2çªç®ã®åŽïŒRS-232ïŒã®æäœæ§ãããã«ç¢ºèªã§ããªãã£ãããïŒæ¥ç¶ããå ŽæããããŸããïŒãæªäœ¿çšã®USARTã³ãŒãã¯äžæçã«ã³ã¡ã³ãåãããŸããã
USBã䜿çšããã«ã¯ãSTMicroelectronicsã®ã©ã€ãã©ãªã䜿çšãããŸãã ã©ã€ãã©ãªèªäœã®ã³ãŒãã詳ãã調ã¹ãªããã°ããã¹ãŠãéåžžã«ç°¡åã§ããããŒããŠã§ã¢ïŒusb_descã[Ch]ãã¡ã€ã«ïŒã®èšè¿°åãåå®çŸ©ããŠãã³ã³ãã¥ãŒã¿ãŒãUSB <-> RS-232ã¢ããã¿ãŒãšããŠèªèããå²ã蟌ã¿ãã³ãã©ãŒãå€æŽããå¿ èŠããããŸãUSBã€ãã³ãïŒå°ãªããšã-åä¿¡ããããŒã¿ãåŠçããã¢ããã¿ãšããŠééçã«åäœããããã«ãããããåä¿¡ããããŒã¿ãUSBçµç±ã§è»¢éããããã«USARTå²ã蟌ã¿åŠçãè¿œå ããå¿ èŠããããŸãïŒã
ã¡ãã»ãŒãžãéä¿¡ããã«ã¯ããªã³ã°ãããã¡ã®ãããªãã®ã䜿çšããŸããããã¯åŸã ã«ãã£ã±ãã«ãªããå¿ èŠã«å¿ããŠUSBçµç±ã§éä¿¡ãããŸãã ãéåžžã®ãããã¡ãã®ããŒã¿ãèªã¿åããŸãã ä»ã®ãšãããçãã³ãã³ãã®ã¿ã䜿çšããŠãããããé·ãããã±ãŒãžã®åŠçã¯æ°ã«ããŸããã§ããã ãã®å ŽåãUSBããããŒã¿ãåä¿¡ããããã®å²ã蟌ã¿ãã³ãã©ãŒãå°ãè€éã«ããå¿ èŠããããŸãã
äžéšã®ã³ãã³ãïŒããšãã°ã1-wireã»ã³ãµãŒããã®æž©åºŠã®èªã¿åãïŒã«ã¯éåžžã«é·ãæéãããããããUSBã³ãã³ãã®ãã³ãã©ãŒã¯ãã®ãããªæäœã®ãã©ã°ã®ã¿ãå€æŽããmainïŒïŒã®ã¡ã€ã³ã«ãŒãããããã®ãã©ã°ãåŠçããŸãã ãã°ããå®è¡ãããæäœïŒLEDã䜿çšïŒã¯ããã®é¢æ°ããçŽæ¥åŒã³åºãããŸãã ãããã°ã®ç®çã§ãã³ãã³ãã«ããšã³ãŒããè¿œå ããç°¡åã«è§£èªããŸãã
ã³ãŒã
void usb_handle_command(uint16_t cnt){ uint8_t command, *answer; uint16_t i; for(i = 0; i < cnt; i++){ command = USB_Rx_Buffer[i]; switch(command){ case CMD_LED_ON: LED_On(); answer = (uint8_t*)"On"; break; case CMD_LED_OFF: LED_Off(); answer = (uint8_t*)"Off"; break; case CMD_LED_BLINK: LED_OnBlink(); answer = (uint8_t*)"Blk"; break; case CMD_LED_DUTY_PLUS: LED_DutyPlus(); answer = (uint8_t*)"Shn"; break; case CMD_LED_DUTY_MINUS: LED_DutyMinus(); answer = (uint8_t*)"Fad"; break; case CMD_1W_GET_TEMP: FLAGS |= FLAG_READ_T; answer = (uint8_t*)"Read T"; break; case CMD_1W_GET_DEV: FLAGS |= FLAG_GETDEV; answer = (uint8_t*)"find devices"; break; case CMD_1W_PRNT_DEV: FLAGS |= FLAG_PRINTDEV; answer = (uint8_t*)"Print devices"; break; case CMD_HALL_GET: FLAGS |= FLAG_PRINTHALL; answer = (uint8_t*)"Print Hall"; break; case CMD_ADC_GET: FLAGS |= FLAG_PRINTADC; answer = (uint8_t*)"Print ADC val"; break; default: answer = (uint8_t*)"Unk"; } newline(); prnt(answer); newline(); } }
ããã§ããã¬ããããŒãã¢ãã«ãUSBçµç±ã§ã³ã³ãã¥ãŒã¿ãŒã«æ¥ç¶ãããšïŒå®éãUSBçµç±ã§çµŠé»ããããããåžžã«ç§ã«æ¥ç¶ãããŸãïŒãdevice / dev / ttyACM0ã衚瀺ãããéåžžã®ã·ãªã¢ã«ããŒãã®ããã«äœæ¥ã§ããŸãã ããšãã°ãã·ãªã¢ã«ã¿ãŒããã«ã䜿çšããŠéããŸãïŒäžã§èšã£ãããã«ãæåã¯tinyserialã䜿çšããŸãïŒã
LEDãã¿ã³
ãããããæ°ããéçã®ç 究ã®å§ãã«ããã€ãªãŒãã§ç¹æ» ãããã®ãäŒçµ±çãªã®ã§ãç§ã¯åãããšãããŸãã åæã«ãããŠãŒã¶ãŒãã¿ã³ãã§å²ã蟌ã¿ãåããšãLEDã®åäœã¢ãŒããå€æŽãããŸãã
ç¹æ» ããã ãã§ã¯é¢çœããããŸãããæãããå€ããã®ã¯é¢çœãã§ãã ãã®ããã«ã¯ãåçŽãªããœãããPWMã§ååã§ãã SysTickã¿ã€ããŒã10ÎŒsã®æéèšå®ããŸãã 2ã€ã®ã«ãŠã³ã¿ãŒãéå§ããŸãã1ã€ã¯LEDããªã³ã«ãªã£ãŠãããã£ãã¯æ°çšã§ããã1ã€ã¯LEDããªãã«ãªã£ãŠãããã£ãã¯æ°çšã§ãã LEDã®èŒåºŠãå€æŽããããã«ãPWMãã¥ãŒãã£ãµã€ã¯ã«ãå€æŽããç°¡åãª8ã¬ãã«ã®ã¹ããŒã ãäœæããŸããã
ããã¯äœãèµ·ãã£ãã®ã§ãïŒ
ã³ãŒã
uint8_t LED_GetState(){ return led_state; } void LED_Duty(uint8_t duty){ duty_cycle = duty; if(led_state == LEDSTATE_BLINK) LED_OnBlink(); } void LED_DutyPlus(){ if(duty_cycle < 7) duty_cycle++; if(led_state == LEDSTATE_BLINK) LED_OnBlink(); } void LED_DutyMinus(){ if(duty_cycle > 0) duty_cycle--; if(led_state == LEDSTATE_BLINK) LED_OnBlink(); } uint8_t LED_GetBlinkState(uint16_t *blink_on, uint16_t *blink_off){ *blink_on = led_blink_on; *blink_off = led_blink_off; return led_state; } void LED_On(){ led_state = LEDSTATE_ON; led_blink_on = 0; led_blink_off = 0; GPIO_ResetBits(GPIOC, GPIO_Pin_12); } void LED_Off(){ led_state = LEDSTATE_OFF; GPIO_SetBits(GPIOC, GPIO_Pin_12); } void LED_OnBlink(){ led_blink_off = 1 << duty_cycle; led_blink_on = 0xff - led_blink_off; led_ticks_on = 0; led_ticks_off = 0; if(led_blink_off == 0){ LED_On(); return; } if(led_blink_on == 0) { LED_Off(); return; } led_state = LEDSTATE_BLINK; } void LED_SysTick_Handler(){ if(led_state != LEDSTATE_BLINK) return; if(led_ticks_on == 0) GPIO_SetBits(GPIOC, GPIO_Pin_12); if(led_ticks_on <= led_blink_on) { led_ticks_on++; return; } if (led_ticks_off == 0){ GPIO_ResetBits(GPIOC, GPIO_Pin_12); } if(led_ticks_off <= led_blink_off){ led_ticks_off++; return; } led_ticks_on = 0; led_ticks_off = 0; }
ããŠãŒã¶ãŒãã¿ã³ãã§ãå€éšå²ã蟌ã¿ããã³ã°ãããŸããã
ã³ãŒã
// Enable the BUTTON Clock RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // Configure Button pin as input GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // Connect Button EXTI Line to Button GPIO Pin GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // Configure Button EXTI line EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); // Enable and set Button EXTI Interrupt to the lowest priority NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
ãããŠããã®ãã³ãã©ãŒã¯ãLEDããç¹æ» ãããŠããå Žåã¯é£ç¶ç¹ç¯ã¢ãŒãã«ãéã«ç¹ç¯ããŠããå Žåã¯ãç¹æ» ãã¢ãŒãã«ãããšããäºå®ã«é¢äžããŠããŸãã
ã³ãŒã
void EXTI0_IRQHandler(void){ if(EXTI_GetITStatus(EXTI_Line0) != RESET){ if(LED_GetState() != LEDSTATE_BLINK) LED_OnBlink(); else LED_On(); EXTI_ClearITPendingBit(EXTI_Line0); } }
1ç·
easyelectronics.ruã®ã©ãããã1-wireãæäœããããã®ã³ãŒããçã¿ãŸããã ããªãå€æŽããŸããã ãŸãããã¹ã«ã¶ãäžãã£ãŠããããã€ã¹ã®æ€çŽ¢æ©èœãå€æŽããŸããïŒäœããã®çç±ã§ããªãªãžãã«ã§ã¯æ©èœããŸããã§ããããããžãã¯ã¯éåžžã«æ確ã§æ£ããããã«èŠããŸããïŒã
ç§ãçãã äŸã§ã¯ã1-wireã¯USARTãä»ããŠæ©èœããDMAã¯èªã¿åã/æžã蟌ã¿ã«äœ¿çšãããŸããã ç§ã¯ãã®ã¢ã€ãã¢ãæ¬åœã«å¥œãã ã£ãã®ã§ããã®æ¹æ³ã§äœ¿çšããŸããïŒãã ãã1-wireããã°ã©ã ãããã³ã«ãç·šæããããšãã§ããŸããïŒã
1ç·ãã¹ãã·ãªã¢ã«ããŒãã«æ¥ç¶ããããã®æšæºçãªã¹ããŒã ã¯ãã·ã§ããããŒãã€ãªãŒãã®ååšãæå³ããŸãã

ããããç§ã¯ãã®ãããªãã€ãªãŒããæã£ãŠããŸããã§ããã ããããããã·ã¥ãã«ã¢ãŒãã«å ããŠãUSART_TXãæ åœããã¬ãã°ããªãŒãã³ãã¬ã€ã³ã¢ãŒãã«åãæ¿ããããšãã§ããããšã«æ°ä»ããŸããããã®å Žåãç絡ã¯çºçããŸããã 1-wireã§äœæ¥ããããã«ãç§ã¯USART3ã䜿çšããŸããïŒãã¬ã€ããŠããéã¯ååãªè¶³ãããã®ã§ãåãããããå¿ èŠã¯ãããŸããïŒã å³ã§ã¯ãUSART3ïŒPB10ããã³PB11ïŒã®èã10kΩã®æµæåšãä»ããŠæ¢ã«æ¥å°ãããŠããããšãããããŸãããæµæåšãã¯ãã ä»ãããå¿ èŠãããããŸããã§ããã
onewire.cãã¡ã€ã«ã®å 容ã«ã€ããŠã¯è©³ãã説æããŸãããããã¯ãã§ã«äœåºŠãè¡ãããŠããŸããã枩床èšãçŽæ¥æäœããããšã®ã¿ã«è§ŠããŸãã
ããã€ã¹ã®æããïŒ-50°Cãè¶ ããïŒéšåã®æž©åºŠãç£èŠããããã«ãåçŽãªDS18S20ã»ã³ãµãŒã䜿çšããããšã«ããŸããïŒèšèŒãããŠãã枬å®ç²ŸåºŠã¯0.5°Cãäžåã£ãŠããŸããïŒã ãã¬ããããŒãã«ã¯ãã ä»ãããããœã±ãããå¿ èŠãªçµè«ã«æ¥ç¶ããŸãããããã«ãããããã€ãã®æž©åºŠèšãåæã«MCã«æ¥ç¶ã§ããŸãã
ããã§ãäŸãã°ã枩床èšã䜿ã£ãŠäœæ¥ãããšãã«åŸããããã®ïŒ
ã³ãŒã
com /dev/ttyACM0 Ca exit, Cx modem lines status [STATUS]: RTS CTS DTR // 'c' : find devices Found 2 devices // 'p' : Print devices device 0: 0x10 0x7c 0xee 0x8f 0x02 0x08 0x00 0x1c device 1: 0x10 0xad 0xbc 0x8f 0x02 0x08 0x00 0xf9 // 't' : Read T Device 0: 0x3b 0x00 0x4b 0x46 0xff 0xff 0x08 0x10 0x39 Device 1: 0x3a 0x00 0x4b 0x46 0xff 0xff 0x0c 0x10 0x41
ãŸãããã¹ãŠã®æž©åºŠèšã«ããŒã¯ãä»ããŠã誰ãã©ã®èå¥åãæã£ãŠãããã確èªããŸããã ãããŠãç§ã¯åœŒãã®èšŒèšã倧ããç°ãªããã©ãã確ãããããšã«ããŸããã 枩床-ã»ã³ãµãŒå¿çã®æåã®2ãã€ãã 7çªç®ã®ãã€ãã«ã¯ãADC枩床èšã«çµã¿èŸŒãŸãã枩床å€æããã®ãæ®ãããæ ŒçŽãããŸãã ã»ã³ãµãŒã®ããã¥ã¡ã³ãã«ãããšããã®æ®çç©ã¯æž©åºŠå€ãæ確ã«ããã®ã«åœ¹ç«ã¡ãŸãã ãããã圌ã®åã¯ã€ã®ã®ä¹³ã®ããã§ããããšãå€æããŸããã
ãã®éçšã§ãã»ã³ãµãŒèªäœãçºç±ãã枬å®çµæã«åœ±é¿ããŸãã ãããã£ãŠãé »ç¹ã«åãåãããªãã§ãã ããã ããã«ãã»ã³ãµãŒã®æž¬å®å€ã¯æ倧0.5床ãŸã§ç°ãªã£ãŠããŸããïŒ ããã念é ã«çœ®ãå¿ èŠããããŸãïŒè€æ°ã®ã»ã³ãµãŒã䜿çšããŠã0.5°C以äžã®ç²ŸåºŠã§äœãã®ã»ã¯ã·ã§ã³éã®æž©åºŠå·®ãç£èŠãããããªæ¹æ³ã§äœ¿çšããå Žåã¯ãæåã«ãã¹ãŠã®ã»ã³ãµãŒãèŒæ£ããå¿ èŠããããŸãã ãŸããã»ã³ãµãŒã®å¿çã§ã¯ãªããèŒæ£åŒã«åŸã£ãŠæž¬å®å€ãååŸããŸãã
å®éã®ã»ã³ãµãŒèª€å·®ã¯0.5°Cãè¶ ããå Žåããããããã»ã³ãµãŒã®ç²ŸåºŠã¯1°Cã§ãããšä»®å®ããããšããå§ãããŸãã
ããŒã«ã»ã³ãµãŒ
ã¢ããã°ããŒã«ã»ã³ãµãŒ-SS495Aã䜿çšããŠããŸãã ã»ã³ãµãŒã®ä»æ§ã¯ã€ã³ã¿ãŒãããã§ç¢ºèªã§ããŸãã åºåã¬ãã°ã®éåžžç¶æ ã§ã¯ãé»å§ã¯çŽ2.5 VïŒè«çãŠãããSTM32ïŒã§ãããå€éšç£å Žã®æ¥µæ§ãšå€§ããã«å¿ããŠã0..5 Vå ã§èªã¿åãå€ãå€åãããšèšãããšãã§ããŸãã åºåé»å§ã5ãã«ãã«éããå¯èœæ§ããããããéåžžã§ã¯ãªãã5ãã«ããïŒä»æ§ã§FRãšããŠæå®ïŒã³ã³ãããŒã©ãŒå ¥åã䜿çšããå¿ èŠããããŸãã
ïŒç¹ã«ãã®ã»ã³ãµãŒã®å ŽåïŒã»ã³ãµãŒã®ãé¢ãïŒããŒã¯ãããé¢ïŒãã1 mm以å ã«äœæ¥é¢ã眮ããšãç£ç³ã®åºåã«ãŒãé»å§ãçŸããŸããã ããã«ãè«çãŒãã®ã¬ãã«ã¯ãé£è¡æ©ã®ã»ã³ãµãŒã®å¹³è¡ã«ããŒã¯ãããåŽã®åº§æšã®ããªãçãé åã«è¡šç€ºãããŸãã äœçœ®æ±ºã粟床ã¯ããªããŸãšãã§ãã
å®éšã®ããã«ããã¬ããããŒãã«1ã€ã®ã»ã³ãµãŒãã¯ãã ä»ãããŸããã 圌ã¯é»æºã5Vã«æ¥ç¶ããä¿¡å·åºåã¯PC10ããŒãã«ã€ãªãã£ãŠããŸãããPC10ããŒãã¯5Vãå°å ãããŠãçããŸããã ããŒãã絶ããåŒã£åŒµããªãããã«ããããã«ãç§ã¯ãããäžæããŸããïŒãã¿ã³ã«äŒŒãŠããŸãïŒã å²ã蟌ã¿ãã³ãã©ãŒã¯å¯Ÿå¿ãããã©ã°ãèšå®ããã ãã§ããã¡ã€ã³ã«ãŒãã§ããã®ãã©ã°ãèšå®ãããŠããå ŽåïŒã€ãŸããç£ç³ãã»ã³ãµãŒã®ãèŠéãã«çŸããããé¢ããå ŽåïŒãPC10ãããããšã確èªããŸãã ãŒããããå ŽåïŒMPãããå ŽåïŒãã¿ãŒããã«ã«ãMagnetããšæžã蟌ã¿ãŸãããã以å€ã®å Žåã¯ãclearããšæžã蟌ã¿ãŸãã ã¿ãŒããã«ã§ãhããæŒãããšã§ãã»ã³ãµãŒããããã©ããã匷å¶çã«ç¢ºèªããããšãã§ããŸãã
ADC
ããŠã©ãŒã ãŸãŒã³ãã«å ããŠãå¯ãïŒäžããæ倧75KïŒã®æž©åºŠã枬å®ããå¿ èŠããããŸãã ããã«ã¯ãADG506Aã¢ããã°ã¹ã€ããã«æ¥ç¶ããããã©ãããµãŒãã¹ã¿ã䜿çšãããŸãã ãã¡ãããããã€ãã£ããã®MSCã³ã³ããŒã¿ãŒã¯ã©ãã»ã©æªãã®ããšæã£ãŠããŸããã枩床枬å®ã«äœ¿çšã§ããŸããïŒ
ADCã䜿çšããSTM32ã®äŸã¯ãã¹ãŠæã£ãŠããã®ã§ãSTDPeriphLibããäŸãåãäžããŸããã ADCãé£ç¶å€æã¢ãŒãã§å®è¡ããçµæãDMAã䜿çšããŠã¡ã¢ãªã«ä¿åããŸãã å€ææéãæ倧ïŒããæ£ç¢ºã«ïŒã«èšå®ãããšããããADCå ¥åPB0ïŒADC8ïŒããã³ã°ãããŸãã
ã³ãŒã
// 0. Configure ADC8 (PB0) as analog input (clocking GPIOB sat on in onewire.c) RCC_ADCCLKConfig(RCC_PCLK2_Div4); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOB, &GPIO_InitStructure); // 1. DMA for converted value (DMA1 clocking sat on at onewire.c) //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_value; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); // 2. ADC1 config ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); // Connect ADC to ADC8 (PB0), ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5); // Enable ADC1 DMA ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE); // Calibration of ADC1 ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd(ADC1, ENABLE); // turn conversion on
ã¹ã€ããã䜿çšããã«ã¯ãå¶åŸ¡ããŒãã®5ããããèšå®ããå¿ èŠããããŸãã ãããå€æãå¿é ããªãããã«ãããŒãCã®æåã®4ããããã¢ãã¬ã¹ãšããŠäœ¿çšãã5çªç®ã®ããããã¹ã€ãããå«ãããŒãšããŠäœ¿çšããŸããã
ã³ãŒã
GPIO_InitStructure.GPIO_Pin = 0x1f; // first 5 bits of PC0 // PC0..PC3 - analog channel address, PC4 - analog enable switch GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure);
ããã«ã¯å²ã蟌ã¿ã¯ãããŸããããinterrupts.cãã¡ã€ã«ã§ã¯ãã³ãã³ãïŒããšãã°ãã³ãã³ã 'a'ïŒãã»ã³ãµãŒã®é»å§ã衚瀺ãããšãã«æ°ãããã©ã°ã®èšå®ãè¿œå ããå¿ èŠããããŸãã mainïŒïŒã§ããã®ãã©ã°ã®åŠçãè¿œå ããŸãã
ã³ãŒã
inline void prntADC(){ uint32_t address; // addr = 0, EN = 1 uint8_t *_2b = (uint8_t *) &ADC_value; for(address = 0x10; address < 0x20; address++){ // changhe channel address & turn on switch GPIOC->BSRR = address; Delay(2); // wait for AD conversion prnt((uint8_t*)"Temperature "); printInt(address&0x0f); prnt((uint8_t*)" = "); printInt(_2b[1]); printInt(_2b[0]); newline(); // turn off switch & reset bits GPIOC->BRR = (uint32_t)0x1f; Delay(2); } }
ã³ãã³ããã«ãŒãã«å°çãããšãã¹ã€ããã§ç®çã®ã¢ãã¬ã¹ã®èšå®ãéå§ããADCãæ©èœãããŸã§æ°ããªç§åŸ æ©ããŠãããçµæã®å€ã衚瀺ããŸãã 次ã«ãã¹ã€ããããªãã«ããŠïŒå¿µã®ããïŒããã«æ°ããªç§åŸ æ©ããŸãã
å¥ã®ãã¬ããããŒãã«ãã¹ã€ããã®ãã¹ãŠã®ã¢ããã°å ¥åãå°ããªãªãŒã ïŒ200..900ãªãŒã ïŒã®æµæåšã§æ¥ç¶ããåçŽãªæµæåå§åšãçµã¿ç«ãŠãŸããã ã°ã©ã³ããS1ã«æ¥ç¶ããSTM32ãã¬ããããŒããã+ 3.3VãS16ã«æ¥ç¶ããŸããã å€ä»ãHDDïŒ12VïŒããå€ãPSUã§ãããã«é»åãäŸçµŠããŸããã
STM32P103ãã¬ããããŒãã§ã¯ãADCã®åºæºé»å§ã¯äžè¬çãªé»æºããååŸãããããã粟床ã¯äœããªããŸããå€ã¯20ãŠããããå€åããããšããããŸãã
ããã§ãããšãã°ã2ã€ã®æ祚ã§äœãèµ·ãã£ãã®ãïŒ
ã³ãŒã
// 1 Temperature 0x00 = 0x00 0x00 Temperature 0x01 = 0x00 0x84 Temperature 0x02 = 0x00 0xaf Temperature 0x03 = 0x01 0xdb Temperature 0x04 = 0x03 0x10 Temperature 0x05 = 0x03 0xe4 Temperature 0x06 = 0x05 0xca Temperature 0x07 = 0x06 0x9b Temperature 0x08 = 0x07 0x4e Temperature 0x09 = 0x08 0xd6 Temperature 0x0a = 0x0a 0x04 Temperature 0x0b = 0x0a 0xb4 Temperature 0x0c = 0x0b 0xfc Temperature 0x0d = 0x0d 0xe0 Temperature 0x0e = 0x0e 0xb7 Temperature 0x0f = 0x0f 0xff // 2 Temperature 0x00 = 0x00 0x00 Temperature 0x01 = 0x00 0x7f Temperature 0x02 = 0x00 0xaf Temperature 0x03 = 0x01 0xdf Temperature 0x04 = 0x03 0x0f Temperature 0x05 = 0x03 0xe4 Temperature 0x06 = 0x05 0xcc Temperature 0x07 = 0x06 0x9d Temperature 0x08 = 0x07 0x5a Temperature 0x09 = 0x08 0xd6 Temperature 0x0a = 0x0a 0x01 Temperature 0x0b = 0x0a 0xb5 Temperature 0x0c = 0x0b 0xfc Temperature 0x0d = 0x0e 0x09 Temperature 0x0e = 0x0e 0xb0 Temperature 0x0f = 0x0f 0xec
äžè¬ã«ãå®å®ããåºæºé»å§æºïŒããã³ããããäŸçµŠããã枬å®åè·¯ïŒãè¿œå ããããäžè¬ã«å€éšADCã䜿çšããå¿ èŠããããŸãã 䜿çšããã»ã³ãµãŒã®æµæãäœããããã¢ã³ããã¯ãã ä»ãããå¿ èŠããããŸãã
ã¹ãããã³ã°ã¢ãŒã¿ãŒ
ãã以æ¥ãç§ã¯çŸ©çã®ç·ããããçµããŠããŸãã ãã¬ããããŒãã«èŠçŽ ãã€ã³ã¹ããŒã«ãããšããäœããé¢éžãããªããšæããŸãã ã¯ãã ä»ãããå¿ èŠããããŸãã ãããŠãããããæ¥å¹Žã ãã¯ãã ä»ãã«å¯ŸåŠããŸãïŒãŸã ã©ãžãªéšåãè³Œå ¥ããå¿ èŠããããŸãïŒã ãããŸã§ã®ãšãããã¹ãããã³ã°ã¢ãŒã¿ãŒã®å¶åŸ¡æ¹æ³ãç°¡åã«èª¬æããŸãã
ã¹ããããã§ã³ãžã£ãŒ-1.2ã¢ã³ãã¢ã®VSS42ã䜿çšããŸãã ãããã¯ãShD-L6208ãã©ã€ããŒã§æã䟿å©ã«ç®¡çãããŸãã ãã®è¶ å°ååè·¯ã§äœæ¥ãããšãã¯ãæ¹åå¶åŸ¡ä¿¡å·ãäœæ¥ã€ããŒãã«ä¿¡å·ãããã³ã¯ããã¯ãã«ã¹ã®ã¿ãéä¿¡ããå¿ èŠããããŸãã ã³ã³ãããŒã©ãŒèªäœãPWMã調æŽããã¢ãŒã¿ãŒå·»ç·ã«å¿ èŠãªé»å§ãèšå®ããŸãã
以äžã«æ³šæããäž»ãªãã®ãææããŸãã
- PWM調æŽã¯ãã»ã³ã¹æµæ䞡端ã®é»å§éäžãåºæºé»å§Vrefãšæ¯èŒããããšã«ããè¡ãããŸãã ãããã£ãŠãé»æµI maxãšæµæR Senseã®æµæã«ã€ããŠããã®äœäžã¯éåžžã«ç°¡åã«èšç®ã§ããŸãã
U ref = I max R ã»ã³ã¹
ã€ãŸã R Sense = 0.33 Ohmã§é»æµå¶éã1.2 Aã«èšå®ããã«ã¯ãU ref = 0.4 Vã«èšå®ããå¿ èŠããããŸããVrefãå®ã«æµ®ãããããå°é¢ã«æŒãä»ãããããªãã§ãã ããã - äœé/é«éæžè¡°ã¢ãŒãã¯åŸæ¥ã®ã³ã¬ã¯ã¿ãŒãšã³ãžã³ã«ãšã£ãŠéèŠã§ãããã¹ããããã£ãµã€ããŒã¯é«éæžè¡°ã¢ãŒãã§ã®ã¿é«éæžè¡°ãå¿ èŠãšããŸãã äžè¬ã«ãåé¯ããªãå Žåã¯ã+ 5VãCONTROLã¬ãã°ã«å°å ããã ãã§ååã§ãã HALF / FULLã§ã¯ã+ 5VãåçŽã«å°å ããããŒãã¹ãããã¢ãŒãã§åäœããŸãã äœçžã«ãŠã³ã¿ãŒããªã»ããããããªãå Žåã¯ãRESETãããã§ãåãããšãè¡ããŸãïŒæ£çŽã«èšããšãåã¹ãããã«8ã¯ããã¯ãã«ã¹ãäžããå¿ èŠã¯ãããŸããïŒã
- ENABLEå
¥åã¯åºåã§ããããŸããL6208ãã©ã€ããŒã§åé¡ãçºçããå ŽåïŒéç±ãé»æµãµãŒãžïŒãè² è·ã®é»å§ãåå¥ã«åæããENABLEã¯ãããã°ã©ã³ãã«åŒã蟌ã¿ãŸãã ã€ãŸããENABLEããŒããå¶åŸ¡ããã³ã³ãããŒã©ãŒã®ãããããªãŒãã³ã³ã¬ã¯ã¿ãŒåºåã¢ãŒãã§ã¢ã¯ãã£ãã«ãªã£ãŠããå Žåãç·æ¥äºæ
ãçºçãããã©ããã確èªã§ããŸãã
STM32ä»æ§ã«ãããšããªãŒãã³ã³ã¬ã¯ã¿ã¢ãŒãã§ã¯ããŠããããããŒãåºåã«äŸçµŠããããšããã©ã³ãžã¹ã¿ã¯åã«èãå°é¢ã«æã¡äžããŸãã åºåããŒãã®å Žåãèãåã³åŒã£åŒµãããŸãã
ãããã£ãŠãã³ã³ãããŒã©ãŒã®è¶³ã+ 5VïŒè¶³ã«FTãéžæããå¿ èŠããããŸãïŒããããšãã°5Ωã®æµæåšãéããŠåŒã£åŒµãããããšENABLEã®éã«ãããšãã°ãããªãŒã ã®æµæåšã貌ãä»ããŸãïŒãããŠãã³ã³ãã³ãµãŒã§ENABLEã®è¶³ãå°é¢ã«ã·ã£ã³ãããããšãå¿ããªãã§ãã ãããããã§ãªããã°ãå¶åŸ¡ã³ã³ãããŒã©ãŒãçŒãããšãã§ããŸãïŒ ïŒãç®çã®ãšã³ãžã³ã®ãªã³/ãªããåãæ¿ããŠãäºæ ã®æç¡ã確èªã§ããŸãïŒãã®ãããã³ã³ãããŒã©ãŒã®å¯Ÿå¿ãã足ã®èœäžèã§åšèŸºã®äžæãåãããšãã§ããŸãïŒã - ä»æ§ã§å€ªåã§ç€ºãããŠããå°äœã¯ãã§ããã ãçãå¹
ãåºãããå¿
èŠããããŸãã ãã ããåæã«ãæµ®é容éãšã€ã³ãã¯ã¿ã³ã¹ãæžããããã«æ³šæããå¿
èŠããããŸãã
R Senseã¯ããã©ã€ããŒã®ã§ããã ãè¿ãã«é 眮ããå¿ èŠããããŸãã ãããããããã»ã©é ããªããšããã«ãã³ã³ãã³ãµCâãšCâïŒä»æ§ã«ããïŒãããã¯ãã§ããæ¯èŒé»æµããã®åè·¯ãæµããã ãã§ãªããéèªå°é»æµãæµããŸãïŒãããã£ãŠã ãã®ãã§ãŒã³ã«ãã€ãªãŒããå«ããããšã¯ã§ããŸãã ïŒã
Câ , ( , , , , ). - : ! 5 .
, , : +5 . , , , 0. . . , USB-, , ...