STM32 + Linux

長い探玢の埌に鉄片の制埡システムを開発するために、STM32 ARMマむクロコントロヌラヌ-STM32F103「ムカデ」バヌゞョンを遞択したした。 たた、開発およびデバッグ甚のブレッドボヌドずしお-STM32P103ただし、脚は少ないですが、コアは同じです。 私はZhZhshkaで少しず぀「成功物語」をレむアりトしたしたが、すべおをたずめお、Linuxでマむクロコントロヌラヌをプログラミングするこずの気持ちに぀いお話したした。 プロゞェクト自䜓はsourceforgeにありたす。







たず、䞀般に぀いお觊れおから、詳现に進みたす。



そのため、ブレッドボヌドモデルたたは完成したデバむス-準備ができたらに加えお、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
      
      









コヌドを䜜成したら、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を調敎し、モヌタヌ巻線に必芁な電圧を蚭定したす。



以䞋に泚意する䞻なものを指摘したす。




All Articles