14 Commits

30 changed files with 574536 additions and 580889 deletions

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1 +1,26 @@
# PCB-Heater # PCB-Heater
PCB reflow station based on a heater plate.
- STM32 MCU
- Color TFT display
- Display Touch control
- Heats the PCB acording to a solder profile
Schematic:
[PDF](kicad/pcb-heater/pcb-heater.pdf)
**Firmware is in WIP stage!**
#### PCB renders
![TOP](/images/pcb-heater-PCB1.png)
![BOTTOM](/images/pcb-heater-PCB2.png)
#### Assembly renders
![CAD](/images/CAD1.png)
![Render](/images/PCB-Heater_render1.png)

View File

@@ -21,7 +21,9 @@
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.554259374" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.554259374" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.262677090" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.262677090" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1482216284" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.1482216284" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1344937624" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.5 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32G070RBTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Middlewares/Third_Party/FreeRTOS/Source/include | ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/STM32G0xx_HAL_Driver/Inc | ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 | ../Drivers/CMSIS/Device/ST/STM32G0xx/Include | ../Drivers/STM32G0xx_HAL_Driver/Inc/Legacy | ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM0 || || || USE_HAL_DRIVER | STM32G070xx | CMSIS_device_header=&lt;stm32g0xx.h&gt; || || Drivers | Core/Startup | Middlewares | Core || || || ${workspace_loc:/${ProjName}/STM32G070RBTX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || " valueType="string"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1344937624" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.6 || Debug || true || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32G070RBTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Middlewares/Third_Party/FreeRTOS/Source/include | ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/STM32G0xx_HAL_Driver/Inc | ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 | ../Drivers/CMSIS/Device/ST/STM32G0xx/Include | ../Drivers/STM32G0xx_HAL_Driver/Inc/Legacy | ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM0 || || || USE_HAL_DRIVER | STM32G070xx | CMSIS_device_header=&lt;stm32g0xx.h&gt; || || Drivers | Core/Startup | Middlewares | Core || || || ${workspace_loc:/${ProjName}/STM32G070RBTX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || || || " valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.1224262438" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="64" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.nanoprintffloat.989318517" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.nanoprintffloat" useByScannerDiscovery="false" value="true" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1893601218" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1893601218" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/PCB-Heater}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1892196526" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/> <builder buildPath="${workspace_loc:/PCB-Heater}/Debug" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1892196526" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1860582162" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler"> <tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1860582162" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
@@ -99,26 +101,27 @@
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.998246015" name="Release" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="rm -rf" description="" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.998246015" name="Release" parent="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release">
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.998246015." name="/" resourcePath=""> <folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.release.998246015." name="/" resourcePath="">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.1071668352" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release"> <toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release.1071668352" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.release">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.956496288" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32G070RBTx" valueType="string"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.956496288" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="true" value="STM32G070RBTx" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1293906698" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.1293906698" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.213198084" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.213198084" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.667446265" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.667446265" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="genericBoard" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1233208762" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.5 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32G070RBTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Middlewares/Third_Party/FreeRTOS/Source/include | ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/STM32G0xx_HAL_Driver/Inc | ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 | ../Drivers/CMSIS/Device/ST/STM32G0xx/Include | ../Drivers/STM32G0xx_HAL_Driver/Inc/Legacy | ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM0 || || || USE_HAL_DRIVER | STM32G070xx | CMSIS_device_header=&lt;stm32g0xx.h&gt; || || Drivers | Core/Startup | Middlewares | Core || || || ${workspace_loc:/${ProjName}/STM32G070RBTX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || " valueType="string"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.1233208762" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults" useByScannerDiscovery="false" value="com.st.stm32cube.ide.common.services.build.inputs.revA.1.0.6 || Release || false || Executable || com.st.stm32cube.ide.mcu.gnu.managedbuild.option.toolchain.value.workspace || STM32G070RBTx || 0 || 0 || arm-none-eabi- || ${gnu_tools_for_stm32_compiler_path} || ../Middlewares/Third_Party/FreeRTOS/Source/include | ../Drivers/CMSIS/Include | ../Core/Inc | ../Drivers/STM32G0xx_HAL_Driver/Inc | ../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS_V2 | ../Drivers/CMSIS/Device/ST/STM32G0xx/Include | ../Drivers/STM32G0xx_HAL_Driver/Inc/Legacy | ../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM0 || || || USE_HAL_DRIVER | STM32G070xx | CMSIS_device_header=&lt;stm32g0xx.h&gt; || || Drivers | Core/Startup | Middlewares | Core || || || ${workspace_loc:/${ProjName}/STM32G070RBTX_FLASH.ld} || true || NonSecure || || secure_nsclib.o || || None || || || " valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.debug.option.cpuclock.1336430547" name="Cpu clock frequence" superClass="com.st.stm32cube.ide.mcu.debug.option.cpuclock" useByScannerDiscovery="false" value="64" valueType="string"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1618910208" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform.1618910208" isAbstract="false" osList="all" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.targetplatform"/>
<builder buildPath="${workspace_loc:/PCB-Heater}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1264878438" managedBuildOn="true" name="Gnu Make Builder.Release" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/> <builder buildPath="${workspace_loc:/PCB-Heater}/Release" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder.1264878438" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.builder"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.909624158" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler"> <tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.909624158" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.180943953" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.180943953" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.option.debuglevel.value.g0" valueType="enumerated"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.1868373984" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/> <inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input.1868373984" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.input"/>
</tool> </tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1886124299" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler"> <tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1886124299" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.1299569526" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.1299569526" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.983020817" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.983020817" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.optimization.level.value.os" valueType="enumerated"/>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1545394168" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols"> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols.1545394168" name="Define symbols (-D)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.definedsymbols" useByScannerDiscovery="false" valueType="definedSymbols">
<listOptionValue builtIn="false" value="CMSIS_device_header=&lt;stm32g0xx.h&gt;"/> <listOptionValue builtIn="false" value="CMSIS_device_header=&lt;stm32g0xx.h&gt;"/>
<listOptionValue builtIn="false" value="USE_HAL_DRIVER"/> <listOptionValue builtIn="false" value="USE_HAL_DRIVER"/>
<listOptionValue builtIn="false" value="STM32G070xx"/> <listOptionValue builtIn="false" value="STM32G070xx"/>
</option> </option>
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.1227338823" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath"> <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths.1227338823" name="Include paths (-I)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.option.includepaths" useByScannerDiscovery="false" valueType="includePath">
<listOptionValue builtIn="false" value="../Core/Inc"/> <listOptionValue builtIn="false" value="../Core/Inc"/>
<listOptionValue builtIn="false" value="../Drivers/STM32G0xx_HAL_Driver/Inc"/> <listOptionValue builtIn="false" value="../Drivers/STM32G0xx_HAL_Driver/Inc"/>
<listOptionValue builtIn="false" value="../Drivers/STM32G0xx_HAL_Driver/Inc/Legacy"/> <listOptionValue builtIn="false" value="../Drivers/STM32G0xx_HAL_Driver/Inc/Legacy"/>
@@ -131,11 +134,11 @@
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1475878643" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/> <inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c.1475878643" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.input.c"/>
</tool> </tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.1623249817" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler"> <tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.1623249817" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.1508746326" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g0" valueType="enumerated"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.1508746326" name="Debug level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.debuglevel.value.g0" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1104854540" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.os" valueType="enumerated"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.1104854540" name="Optimization level" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.option.optimization.level.value.os" valueType="enumerated"/>
</tool> </tool>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.1774295902" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker"> <tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.1774295902" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker">
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1410337642" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32G070RBTX_FLASH.ld}" valueType="string"/> <option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script.1410337642" name="Linker Script (-T)" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.option.script" value="${workspace_loc:/${ProjName}/STM32G070RBTX_FLASH.ld}" valueType="string"/>
<inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.113680125" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input"> <inputType id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input.113680125" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.input">
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
<additionalInput kind="additionalinput" paths="$(LIBS)"/> <additionalInput kind="additionalinput" paths="$(LIBS)"/>
@@ -177,5 +180,12 @@
</scannerConfigBuildInfo> </scannerConfigBuildInfo>
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
<storageModule moduleId="refreshScope"/> <storageModule moduleId="refreshScope" versionNumber="2">
<configuration configurationName="Debug">
<resource resourceType="PROJECT" workspacePath="/PCB-Heater"/>
</configuration>
<configuration configurationName="Release">
<resource resourceType="PROJECT" workspacePath="/PCB-Heater"/>
</configuration>
</storageModule>
</cproject> </cproject>

View File

@@ -5,7 +5,7 @@
<provider-reference id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.ui.UserLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="596919080754294639" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-690114333473919073" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>
@@ -17,7 +17,7 @@
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/> <provider copy-of="extension" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="596919080754294639" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true"> <provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="-690114333473919073" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/> <language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/> <language-scope id="org.eclipse.cdt.core.g++"/>
</provider> </provider>

View File

@@ -105,6 +105,7 @@ void Error_Handler(void);
#define TIM1_GC_GPIO_Port GPIOA #define TIM1_GC_GPIO_Port GPIOA
#define BUZZER_Pin GPIO_PIN_9 #define BUZZER_Pin GPIO_PIN_9
#define BUZZER_GPIO_Port GPIOB #define BUZZER_GPIO_Port GPIOB
/* USER CODE BEGIN Private defines */ /* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */ /* USER CODE END Private defines */

View File

@@ -49,6 +49,7 @@
void NMI_Handler(void); void NMI_Handler(void);
void HardFault_Handler(void); void HardFault_Handler(void);
void TIM6_IRQHandler(void); void TIM6_IRQHandler(void);
void TIM16_IRQHandler(void);
void TIM17_IRQHandler(void); void TIM17_IRQHandler(void);
/* USER CODE BEGIN EFP */ /* USER CODE BEGIN EFP */

View File

@@ -38,6 +38,8 @@ extern TIM_HandleTypeDef htim14;
extern TIM_HandleTypeDef htim15; extern TIM_HandleTypeDef htim15;
extern TIM_HandleTypeDef htim16;
extern TIM_HandleTypeDef htim17; extern TIM_HandleTypeDef htim17;
/* USER CODE BEGIN Private defines */ /* USER CODE BEGIN Private defines */
@@ -47,6 +49,7 @@ extern TIM_HandleTypeDef htim17;
void MX_TIM1_Init(void); void MX_TIM1_Init(void);
void MX_TIM14_Init(void); void MX_TIM14_Init(void);
void MX_TIM15_Init(void); void MX_TIM15_Init(void);
void MX_TIM16_Init(void);
void MX_TIM17_Init(void); void MX_TIM17_Init(void);
void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);

View File

@@ -103,6 +103,10 @@ typedef struct {
#define SCR_DIALOG 3 #define SCR_DIALOG 3
#define SCR_BOOT 99 #define SCR_BOOT 99
//Pulses
#define P_WIDTH 40 // Triac gate Pulse width
#define P_DELAY 5 // Minimum delay before gate pulse
/* USER CODE END PD */ /* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/
@@ -160,10 +164,13 @@ static uint8_t Stage = 0; //current stage of a profile
static float spp; //Seconds per pixel (horizontal) static float spp; //Seconds per pixel (horizontal)
static float dpp; //Degrees per pixel (vertical) static float dpp; //Degrees per pixel (vertical)
uint16_t Timer = 0; //Time counter uint16_t Timer = 0; //Time counter
uint16_t Timer10 = 0; //Time x10 counter
static uint8_t fanActive = 0; //Fans are active flag
static uint8_t Running = 0; //Running program flag
settings_t settings = { //settings structure settings_t settings = { //settings structure
20, // uint8_t temp_offset 20, // uint8_t temp_offset
0, // uint8_t color_scheme 0, // uint8_t color_scheme
0, // uint8_t btn_clicks 1, // uint8_t btn_clicks
100, // uint8_t brightness 100, // uint8_t brightness
0, // uint8_t language 0, // uint8_t language
1 // uint8_t boot_screen 1 // uint8_t boot_screen
@@ -184,12 +191,12 @@ const presets_t presets[4] = {
PIDController pid = { PIDController pid = {
.Kp = 40.0f, .Kp = 40.0f,
.Ki = 20.0f, .Ki = 1.0f,
.Kd = 5.0f, .Kd = 3.0f,
.T = 0.5f, //2 times per second .T = 0.25f, //2 times per second
.tau = 0.2f, //Low-pass filter (0 - no filter) .tau = 0.2f, //Low-pass filter (0 - no filter)
.limMin = 0.0f, .limMin = -100.0f,
.limMax = 969.0f .limMax = 1000.0f - P_WIDTH - P_DELAY - 1 // 949.0
}; };
/* USER CODE END Variables */ /* USER CODE END Variables */
@@ -237,15 +244,19 @@ const osMutexAttr_t mutScreen_attributes = {
/* Private function prototypes -----------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */ /* USER CODE BEGIN FunctionPrototypes */
void btnPressed(uint8_t id); //buttons actions void btnPressed(uint8_t id); //buttons actions
void updateTInfo(void); void updateTInfo(uint16_t lvl);
void drawBootScreen(void); void drawBootScreen(void);
void drawMainScreen(void); void drawMainScreen(void);
void drawRunningScreen(void); void drawRunningScreen(void);
void drawSettingsScreen(void); void drawSettingsScreen(void);
void drawPlan(uint8_t use_mutex, uint8_t numbers, uint8_t wide); void drawPlan(uint8_t use_mutex, uint8_t numbers, uint8_t wide);
void playSound(uint8_t sound); //Play one of the beeps void playSound(uint8_t sound, uint8_t note); //Play one of the beeps
void playTestSound(); //Play a test sound
void setSoundPitch(uint8_t note); //Set sound pitch (note) 0-6 - A2-A8
void drawButton(uint8_t id, uint8_t func); //Draw a button by ID void drawButton(uint8_t id, uint8_t func); //Draw a button by ID
void setFansSpeed(uint8_t speed); //Set fans speed
void stopHeater(void); //Stop the heater and reset the PID
/* USER CODE END FunctionPrototypes */ /* USER CODE END FunctionPrototypes */
@@ -376,7 +387,7 @@ void svc_display(void *argument)
) { ) {
lastPressed = id; lastPressed = id;
playSound(S_CLICK); playSound(S_CLICK, 2);
osMutexAcquire(mutScreenHandle, osWaitForever); osMutexAcquire(mutScreenHandle, osWaitForever);
if (id < 4) { if (id < 4) {
@@ -441,9 +452,6 @@ void svc_sensor(void *argument)
/* Infinite loop */ /* Infinite loop */
float temp, res, res_old; float temp, res, res_old;
uint8_t i; uint8_t i;
uint16_t pulse;
int in, fr;
static char str[12] = {0};
PID_Init(&pid); PID_Init(&pid);
@@ -457,17 +465,9 @@ void svc_sensor(void *argument)
} }
if (temp >= 0.0f) { if (temp >= 0.0f) {
res = res / 3; res = res / 3;
//PID
if (Preset == 2) {
PID_Update(&pid, 35.0f, res);
pulse = (uint16_t)(pid.limMax - pid.out)+20;
TIM1->ARR = pulse+10;
TIM1->CCR2 = pulse;
}
} else { } else {
res = temp; res = temp;
PID_Init(&pid); stopHeater();
TIM1->CCR2 = 1020;
} }
Temperature = res; Temperature = res;
if (res != res_old) { if (res != res_old) {
@@ -475,19 +475,11 @@ void svc_sensor(void *argument)
osMessageQueuePut(tempUpdateHandle, &res, 0, 50); osMessageQueuePut(tempUpdateHandle, &res, 0, 50);
} }
//Draw PID value //If no program is running and T is more than 45C - turn on Fans; else - turn them off
if (Screen == SCR_RUNNING) { if (!Running && Temperature > 50.0f) setFansSpeed(100);
in = (int)(pid.out); if (!Running && Temperature <= 44.0f && fanActive) setFansSpeed(0);
fr = (int)((pid.out-in)*100);
snprintf(str, 7, "%3d.%02d", in, fr);
osMutexAcquire(mutScreenHandle, osWaitForever);
ST7793_SetFontSize(1);
ST7793_FillRect(Darkergray, 11, 180, 27, 192);
ST7793_DrawString(Black, Darkergray, str, 11, 180);
osMutexRelease(mutScreenHandle);
}
osDelay(500); osDelay(250);
} }
/* USER CODE END svc_sensor */ /* USER CODE END svc_sensor */
} }
@@ -533,18 +525,52 @@ void clockTick(void *argument)
uint16_t x, y; uint16_t x, y;
static uint16_t stime, stemp; //starting time and temperature for a stage static uint16_t stime, stemp; //starting time and temperature for a stage
static float dps; //degrees per second static float dps; //degrees per second
static uint16_t pulse; //to calculate pulse for TIM1
if (Temperature < 0.0f) { if (Temperature < 0.0f) {
osTimerStop(secTimerHandle); stopHeater();
return; return;
} }
if (Timer == 0) {
//PID
PID_Update(&pid, aimTemperature, Temperature);
if (pid.out >= 0.0f) {
pulse = (uint16_t)(pid.limMax - pid.out)+P_DELAY;
if (fanActive) setFansSpeed(0);
}
else {
pulse = 1020;
setFansSpeed((uint8_t)(pid.out * -1));
}
TIM1->ARR = pulse+P_WIDTH;
TIM1->CCR2 = pulse;
//Draw PID value
if (Screen == SCR_RUNNING) {
snprintf(str, 7, "%3.2f", pid.out);
//snprintf(str, 7, "%3d.%02d", (int)pid.out, (int)((pid.out-(int)pid.out)*100));
osMutexAcquire(mutScreenHandle, osWaitForever);
ST7793_SetFontSize(1);
ST7793_FillRect(Darkergray, 11, 180, 27, 192);
ST7793_DrawString(Black, Darkergray, str, 11, 180);
snprintf(str, 7, "P:%4d", pulse);
ST7793_FillRect(Lightgray, 100, 50, 116, 62);
ST7793_DrawString(Black, Lightgray, str, 100, 50);
osMutexRelease(mutScreenHandle);
}
if (Timer == 0 && Timer10 == 0) {
stime = 0; stime = 0;
stemp = 20; stemp = 20;
dps = (presets[Preset].temperature[Stage] - stemp) / (float)(presets[Preset].time[Stage]); dps = (presets[Preset].temperature[Stage] - stemp) / (float)(presets[Preset].time[Stage]);
Running = 1;
} }
Timer10++;
if (Timer10%4 != 0) return;
Timer++; Timer++;
osMutexAcquire(mutScreenHandle, osWaitForever); osMutexAcquire(mutScreenHandle, osWaitForever);
@@ -553,7 +579,8 @@ void clockTick(void *argument)
ST7793_SetFontSize(2); ST7793_SetFontSize(2);
ST7793_DrawStringC(Yellow, Darkergray, "Done!", 210, 5); ST7793_DrawStringC(Yellow, Darkergray, "Done!", 210, 5);
osMutexRelease(mutScreenHandle); osMutexRelease(mutScreenHandle);
osTimerStop(secTimerHandle); stopHeater();
setFansSpeed(100);
return; return;
} }
@@ -580,63 +607,49 @@ void clockTick(void *argument)
//Calculate new aim temperature //Calculate new aim temperature
aimTemperature = (Timer - stime) * dps + stemp; aimTemperature = (Timer - stime) * dps + stemp;
snprintf(str, 8, "%3d.%02d", (int)aimTemperature, (int)((aimTemperature - (int)aimTemperature)*100)); snprintf(str, 8, "%3.2f", aimTemperature);
//snprintf(str, 8, "%3d.%02d", (int)aimTemperature, (int)((aimTemperature - (int)aimTemperature)*100));
ST7793_SetFontSize(1); ST7793_SetFontSize(1);
ST7793_DrawString(Black, Darkergray, str, 10, 140); ST7793_DrawString(Black, Darkergray, str, 10, 140);
osMutexRelease(mutScreenHandle); osMutexRelease(mutScreenHandle);
/* USER CODE END clockTick */ /* USER CODE END clockTick */
} }
/* Private application code --------------------------------------------------*/ /* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */ /* USER CODE BEGIN Application */
char str[10] = {0}; char str[10] = {0};
uint16_t lvl = 989; //uint16_t lvl = 989;
void btnPressed(uint8_t id) { void btnPressed(uint8_t id) {
switch (id) { switch (id) {
case BTN_PRE1: // PRE1 case BTN_PRE1: // PRE1
PID_Init(&pid);
TIM1->CCR2 = 1020;
ST7793_Brightness(99);
break; break;
case BTN_PRE2: // PRE2 case BTN_PRE2: // PRE2
lvl -= 50;
if (lvl < 60) lvl = 989;
TIM1->ARR = lvl+10;
TIM1->CCR2 = lvl;
//htim1.Instance->EGR |= 1;
updateTInfo();
ST7793_Brightness(75);
break; break;
case BTN_PRE3: // PRE3 case BTN_PRE3: // PRE3
PID_Init(&pid);
ST7793_Brightness(50);
break; break;
case BTN_PRE4: // PRE4 case BTN_PRE4: // PRE4
lvl += 50;
if (lvl > 930) lvl = 60;
TIM1->ARR = lvl+10;
TIM1->CCR2 = lvl;
updateTInfo();
ST7793_Brightness(25);
break; break;
case BTN_START: // START case BTN_START: // START
Timer = 0; Timer = 0;
Timer10 = 0;
Stage = 0; Stage = 0;
drawRunningScreen(); drawRunningScreen();
osTimerStart(secTimerHandle, 1000); osTimerStart(secTimerHandle, 250);
break; break;
case BTN_COG: // COG (Settings) case BTN_COG: // COG (Settings)
// drawBootScreen();
// osDelay(10000);
// drawMainScreen();
drawSettingsScreen(); drawSettingsScreen();
break; break;
case BTN_STOP: case BTN_STOP:
osTimerStop(secTimerHandle); stopHeater();
drawMainScreen(); drawMainScreen();
break; break;
case BTN_OK: case BTN_OK:
@@ -645,7 +658,7 @@ void btnPressed(uint8_t id) {
} }
} }
void updateTInfo(void) { void updateTInfo(uint16_t lvl) {
osMutexAcquire(mutScreenHandle, osWaitForever); osMutexAcquire(mutScreenHandle, osWaitForever);
ST7793_SetFontSize(1); ST7793_SetFontSize(1);
snprintf(str, 8, "T:%d", lvl); snprintf(str, 8, "T:%d", lvl);
@@ -818,7 +831,7 @@ void drawPlan(uint8_t use_mutex, uint8_t numbers, uint8_t wide) {
} }
//Play one of the beeps //Play one of the beeps
void playSound(uint8_t sound) { void playSound(uint8_t sound, uint8_t note) {
uint16_t time; uint16_t time;
uint8_t enabled = 1; uint8_t enabled = 1;
@@ -831,15 +844,52 @@ void playSound(uint8_t sound) {
break; break;
case S_CLICK: case S_CLICK:
if (!settings.btn_clicks) enabled = 0; if (!settings.btn_clicks) enabled = 0;
else time = 10; else time = 5;
break; break;
} }
if (enabled) { if (enabled) {
TIM17->ARR = time; setSoundPitch(note);
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET); TIM16->ARR = time;
HAL_TIM_Base_Start_IT(&htim17); //HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
HAL_TIM_Base_Start_IT(&htim16);
} }
}
//Play a test sound
void playTestSound() {
static uint8_t i;
for (i=0; i<6; i++) {
setSoundPitch(i);
HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
osDelay(500);
}
HAL_TIM_PWM_Stop(&htim17, TIM_CHANNEL_1);
}
//Set sound pitch
void setSoundPitch(uint8_t note) {
static const uint16_t notes[] = {
58182, //A2
29091, //A3
14545, //A4
7273, //A5
3636, //A6
1818, //A7
909 //A8
};
if (note > 6) note = 0;
htim17.Init.Period = notes[note];
HAL_TIM_Base_Init(&htim17);
TIM_OC_InitTypeDef conf = {0};
conf.OCMode = TIM_OCMODE_PWM1;
conf.Pulse = notes[note] >> 1;
conf.OCPolarity = TIM_OCPOLARITY_HIGH;
conf.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim17, &conf, TIM_CHANNEL_1);
} }
//Draw a button by ID //Draw a button by ID
@@ -857,5 +907,31 @@ void drawButton(uint8_t id, uint8_t func) {
func func
); );
} }
//Set fans speed
void setFansSpeed(uint8_t speed) {
if (speed == 0) {
if (fanActive) {
HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1);
fanActive = 0;
}
} else {
if (speed > 100) speed = 100;
TIM14->CCR1 = speed;
if (!fanActive) {
fanActive = 1;
HAL_TIM_PWM_Start(&htim14, TIM_CHANNEL_1);
}
}
}
//Stop the heater and reset the PID
void stopHeater(void) {
if (osTimerIsRunning(secTimerHandle)) osTimerStop(secTimerHandle);
aimTemperature = 0.0f;
PID_Init(&pid);
TIM1->CCR2 = 1020;
Running = 0;
}
/* USER CODE END Application */ /* USER CODE END Application */

View File

@@ -58,7 +58,7 @@ void MX_GPIO_Init(void)
|LCD_D4_Pin|LCD_D5_Pin|LCD_D6_Pin|LCD_D7_Pin, GPIO_PIN_RESET); |LCD_D4_Pin|LCD_D5_Pin|LCD_D6_Pin|LCD_D7_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */ /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, LCD_RS_Pin|LCD_WR_Pin|BUZZER_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB, LCD_RS_Pin|LCD_WR_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */ /*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(MAX_CS_GPIO_Port, MAX_CS_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(MAX_CS_GPIO_Port, MAX_CS_Pin, GPIO_PIN_SET);
@@ -99,12 +99,12 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure GPIO pins : PBPin PBPin */ /*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = MAX_CS_Pin|BUZZER_Pin; GPIO_InitStruct.Pin = MAX_CS_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_Init(MAX_CS_GPIO_Port, &GPIO_InitStruct);
} }

View File

@@ -98,8 +98,16 @@ int main(void)
MX_TIM15_Init(); MX_TIM15_Init();
MX_TIM14_Init(); MX_TIM14_Init();
MX_USART1_UART_Init(); MX_USART1_UART_Init();
MX_TIM16_Init();
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
__HAL_TIM_CLEAR_FLAG(&htim17, TIM_SR_UIF); //clear the update flag so it wont trigger right away;
// TIM1 - Zero crossing and Triac duty
// TIM14 - Cooling fans PWM
// TIM15 - LCD backlight PWM
// TIM16 - Count beep duration
// TIM17 - PWM for passive buzzer
__HAL_TIM_CLEAR_FLAG(&htim16, TIM_SR_UIF); //clear the update flag so it wont trigger right away;
if (ST7793_Init() != 0) { if (ST7793_Init() != 0) {
HAL_GPIO_WritePin(LED_Status_GPIO_Port, LED_Status_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(LED_Status_GPIO_Port, LED_Status_Pin, GPIO_PIN_SET);
while (1) {;} while (1) {;}
@@ -109,6 +117,14 @@ int main(void)
HAL_TIM_OnePulse_Start(&htim1, 2); HAL_TIM_OnePulse_Start(&htim1, 2);
//TIM1->CR1 |= TIM_CR1_CEN; //TIM1->CR1 |= TIM_CR1_CEN;
HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim15, TIM_CHANNEL_1);
HAL_TIM_Base_Start(&htim14);
//HAL_TIM_Base_Start(&htim17);
// Boot beep
HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
HAL_Delay(70);
HAL_TIM_PWM_Stop(&htim17, TIM_CHANNEL_1);
/* USER CODE END 2 */ /* USER CODE END 2 */
/* Init scheduler */ /* Init scheduler */
@@ -198,9 +214,10 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
} }
/* USER CODE BEGIN Callback 1 */ /* USER CODE BEGIN Callback 1 */
if (htim->Instance == TIM17) { if (htim->Instance == TIM16) {
HAL_TIM_Base_Stop_IT(&htim17); HAL_TIM_Base_Stop_IT(&htim16);
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET); HAL_TIM_PWM_Stop(&htim17, TIM_CHANNEL_1);
//HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
} }
/* USER CODE END Callback 1 */ /* USER CODE END Callback 1 */

View File

@@ -22,7 +22,7 @@ void PID_Init(PIDController *pid) {
float PID_Update(PIDController *pid, float setpoint, float measurement) { float PID_Update(PIDController *pid, float setpoint, float measurement) {
// PID = Kp + Ki * 1/s + Kd * s/(s*tau+1) // PID = Kp + Ki * 1/s + Kd * s/(s*tau+1)
// e = error tothe setpoint // e = error to the setpoint
// p[n] = Kp * e[n] // p[n] = Kp * e[n]
// i[n] = Ki*T/2 * (e[n]+e[n-1]) + i[n-1] // i[n] = Ki*T/2 * (e[n]+e[n-1]) + i[n-1]
// d[n] = 2*Kd/(2*tau+T) * (e[n]-e[n-1]) + (2*tau-T)/(2*tau+T) * d[n-1] // d[n] = 2*Kd/(2*tau+T) * (e[n]-e[n-1]) + (2*tau-T)/(2*tau+T) * d[n-1]

View File

@@ -20,6 +20,7 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "main.h" #include "main.h"
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
/* USER CODE END Includes */ /* USER CODE END Includes */

View File

@@ -72,6 +72,7 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
htim6.Instance = TIM6; htim6.Instance = TIM6;
/* Initialize TIMx peripheral as follow: /* Initialize TIMx peripheral as follow:
+ Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base. + Period = [(TIM6CLK/1000) - 1]. to have a (1/1000) s time base.
+ Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock.
+ ClockDivision = 0 + ClockDivision = 0

View File

@@ -55,6 +55,7 @@
/* USER CODE END 0 */ /* USER CODE END 0 */
/* External variables --------------------------------------------------------*/ /* External variables --------------------------------------------------------*/
extern TIM_HandleTypeDef htim16;
extern TIM_HandleTypeDef htim17; extern TIM_HandleTypeDef htim17;
extern TIM_HandleTypeDef htim6; extern TIM_HandleTypeDef htim6;
@@ -116,6 +117,20 @@ void TIM6_IRQHandler(void)
/* USER CODE END TIM6_IRQn 1 */ /* USER CODE END TIM6_IRQn 1 */
} }
/**
* @brief This function handles TIM16 global interrupt.
*/
void TIM16_IRQHandler(void)
{
/* USER CODE BEGIN TIM16_IRQn 0 */
/* USER CODE END TIM16_IRQn 0 */
HAL_TIM_IRQHandler(&htim16);
/* USER CODE BEGIN TIM16_IRQn 1 */
/* USER CODE END TIM16_IRQn 1 */
}
/** /**
* @brief This function handles TIM17 global interrupt. * @brief This function handles TIM17 global interrupt.
*/ */

View File

@@ -27,6 +27,7 @@
TIM_HandleTypeDef htim1; TIM_HandleTypeDef htim1;
TIM_HandleTypeDef htim14; TIM_HandleTypeDef htim14;
TIM_HandleTypeDef htim15; TIM_HandleTypeDef htim15;
TIM_HandleTypeDef htim16;
TIM_HandleTypeDef htim17; TIM_HandleTypeDef htim17;
/* TIM1 init function */ /* TIM1 init function */
@@ -50,7 +51,7 @@ void MX_TIM1_Init(void)
htim1.Instance = TIM1; htim1.Instance = TIM1;
htim1.Init.Prescaler = 640-1; htim1.Init.Prescaler = 640-1;
htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 999; htim1.Init.Period = 1000-1;
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim1.Init.RepetitionCounter = 0; htim1.Init.RepetitionCounter = 0;
htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
@@ -147,9 +148,9 @@ void MX_TIM14_Init(void)
/* USER CODE END TIM14_Init 1 */ /* USER CODE END TIM14_Init 1 */
htim14.Instance = TIM14; htim14.Instance = TIM14;
htim14.Init.Prescaler = 0; htim14.Init.Prescaler = 10-1;
htim14.Init.CounterMode = TIM_COUNTERMODE_UP; htim14.Init.CounterMode = TIM_COUNTERMODE_UP;
htim14.Init.Period = 65535; htim14.Init.Period = 100-1;
htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim14) != HAL_OK) if (HAL_TIM_Base_Init(&htim14) != HAL_OK)
@@ -161,7 +162,7 @@ void MX_TIM14_Init(void)
Error_Handler(); Error_Handler();
} }
sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0; sConfigOC.Pulse = 100;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) if (HAL_TIM_PWM_ConfigChannel(&htim14, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
@@ -191,7 +192,7 @@ void MX_TIM15_Init(void)
/* USER CODE END TIM15_Init 1 */ /* USER CODE END TIM15_Init 1 */
htim15.Instance = TIM15; htim15.Instance = TIM15;
htim15.Init.Prescaler = 320-1; htim15.Init.Prescaler = 640-1;
htim15.Init.CounterMode = TIM_COUNTERMODE_UP; htim15.Init.CounterMode = TIM_COUNTERMODE_UP;
htim15.Init.Period = 100-1; htim15.Init.Period = 100-1;
htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
@@ -244,6 +245,37 @@ void MX_TIM15_Init(void)
/* USER CODE END TIM15_Init 2 */ /* USER CODE END TIM15_Init 2 */
HAL_TIM_MspPostInit(&htim15); HAL_TIM_MspPostInit(&htim15);
}
/* TIM16 init function */
void MX_TIM16_Init(void)
{
/* USER CODE BEGIN TIM16_Init 0 */
/* USER CODE END TIM16_Init 0 */
/* USER CODE BEGIN TIM16_Init 1 */
/* USER CODE END TIM16_Init 1 */
htim16.Instance = TIM16;
htim16.Init.Prescaler = 64000-1;
htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
htim16.Init.Period = 999;
htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim16.Init.RepetitionCounter = 0;
htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim16) != HAL_OK)
{
Error_Handler();
}
if (HAL_TIM_OnePulse_Init(&htim16, TIM_OPMODE_SINGLE) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN TIM16_Init 2 */
/* USER CODE END TIM16_Init 2 */
} }
/* TIM17 init function */ /* TIM17 init function */
void MX_TIM17_Init(void) void MX_TIM17_Init(void)
@@ -253,13 +285,16 @@ void MX_TIM17_Init(void)
/* USER CODE END TIM17_Init 0 */ /* USER CODE END TIM17_Init 0 */
TIM_OC_InitTypeDef sConfigOC = {0};
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
/* USER CODE BEGIN TIM17_Init 1 */ /* USER CODE BEGIN TIM17_Init 1 */
/* USER CODE END TIM17_Init 1 */ /* USER CODE END TIM17_Init 1 */
htim17.Instance = TIM17; htim17.Instance = TIM17;
htim17.Init.Prescaler = 64000-1; htim17.Init.Prescaler = 10-1;
htim17.Init.CounterMode = TIM_COUNTERMODE_UP; htim17.Init.CounterMode = TIM_COUNTERMODE_UP;
htim17.Init.Period = 999; htim17.Init.Period = 14545-1;
htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim17.Init.RepetitionCounter = 0; htim17.Init.RepetitionCounter = 0;
htim17.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; htim17.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
@@ -267,13 +302,37 @@ void MX_TIM17_Init(void)
{ {
Error_Handler(); Error_Handler();
} }
if (HAL_TIM_OnePulse_Init(&htim17, TIM_OPMODE_SINGLE) != HAL_OK) if (HAL_TIM_PWM_Init(&htim17) != HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 7272;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
if (HAL_TIM_PWM_ConfigChannel(&htim17, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
Error_Handler();
}
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 0;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.BreakFilter = 0;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
if (HAL_TIMEx_ConfigBreakDeadTime(&htim17, &sBreakDeadTimeConfig) != HAL_OK)
{ {
Error_Handler(); Error_Handler();
} }
/* USER CODE BEGIN TIM17_Init 2 */ /* USER CODE BEGIN TIM17_Init 2 */
/* USER CODE END TIM17_Init 2 */ /* USER CODE END TIM17_Init 2 */
HAL_TIM_MspPostInit(&htim17);
} }
@@ -326,6 +385,21 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM15_MspInit 1 */ /* USER CODE END TIM15_MspInit 1 */
} }
else if(tim_baseHandle->Instance==TIM16)
{
/* USER CODE BEGIN TIM16_MspInit 0 */
/* USER CODE END TIM16_MspInit 0 */
/* TIM16 clock enable */
__HAL_RCC_TIM16_CLK_ENABLE();
/* TIM16 interrupt Init */
HAL_NVIC_SetPriority(TIM16_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(TIM16_IRQn);
/* USER CODE BEGIN TIM16_MspInit 1 */
/* USER CODE END TIM16_MspInit 1 */
}
else if(tim_baseHandle->Instance==TIM17) else if(tim_baseHandle->Instance==TIM17)
{ {
/* USER CODE BEGIN TIM17_MspInit 0 */ /* USER CODE BEGIN TIM17_MspInit 0 */
@@ -408,6 +482,27 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
/* USER CODE END TIM15_MspPostInit 1 */ /* USER CODE END TIM15_MspPostInit 1 */
} }
else if(timHandle->Instance==TIM17)
{
/* USER CODE BEGIN TIM17_MspPostInit 0 */
/* USER CODE END TIM17_MspPostInit 0 */
__HAL_RCC_GPIOB_CLK_ENABLE();
/**TIM17 GPIO Configuration
PB9 ------> TIM17_CH1
*/
GPIO_InitStruct.Pin = BUZZER_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM17;
HAL_GPIO_Init(BUZZER_GPIO_Port, &GPIO_InitStruct);
/* USER CODE BEGIN TIM17_MspPostInit 1 */
/* USER CODE END TIM17_MspPostInit 1 */
}
} }
@@ -454,6 +549,20 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
/* USER CODE END TIM15_MspDeInit 1 */ /* USER CODE END TIM15_MspDeInit 1 */
} }
else if(tim_baseHandle->Instance==TIM16)
{
/* USER CODE BEGIN TIM16_MspDeInit 0 */
/* USER CODE END TIM16_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_TIM16_CLK_DISABLE();
/* TIM16 interrupt Deinit */
HAL_NVIC_DisableIRQ(TIM16_IRQn);
/* USER CODE BEGIN TIM16_MspDeInit 1 */
/* USER CODE END TIM16_MspDeInit 1 */
}
else if(tim_baseHandle->Instance==TIM17) else if(tim_baseHandle->Instance==TIM17)
{ {
/* USER CODE BEGIN TIM17_MspDeInit 0 */ /* USER CODE BEGIN TIM17_MspDeInit 0 */

View File

@@ -28,7 +28,8 @@ Mcu.CPN=STM32G070RBT6
Mcu.Family=STM32G0 Mcu.Family=STM32G0
Mcu.IP0=ADC1 Mcu.IP0=ADC1
Mcu.IP1=FREERTOS Mcu.IP1=FREERTOS
Mcu.IP10=USART1 Mcu.IP10=TIM17
Mcu.IP11=USART1
Mcu.IP2=NVIC Mcu.IP2=NVIC
Mcu.IP3=RCC Mcu.IP3=RCC
Mcu.IP4=SPI2 Mcu.IP4=SPI2
@@ -36,8 +37,8 @@ Mcu.IP5=SYS
Mcu.IP6=TIM1 Mcu.IP6=TIM1
Mcu.IP7=TIM14 Mcu.IP7=TIM14
Mcu.IP8=TIM15 Mcu.IP8=TIM15
Mcu.IP9=TIM17 Mcu.IP9=TIM16
Mcu.IPNb=11 Mcu.IPNb=12
Mcu.Name=STM32G070RBTx Mcu.Name=STM32G070RBTx
Mcu.Package=LQFP64 Mcu.Package=LQFP64
Mcu.Pin0=PC12 Mcu.Pin0=PC12
@@ -73,20 +74,21 @@ Mcu.Pin35=VP_TIM1_VS_ClockSourceINT
Mcu.Pin36=VP_TIM1_VS_OPM Mcu.Pin36=VP_TIM1_VS_OPM
Mcu.Pin37=VP_TIM14_VS_ClockSourceINT Mcu.Pin37=VP_TIM14_VS_ClockSourceINT
Mcu.Pin38=VP_TIM15_VS_ClockSourceINT Mcu.Pin38=VP_TIM15_VS_ClockSourceINT
Mcu.Pin39=VP_TIM17_VS_ClockSourceINT Mcu.Pin39=VP_TIM16_VS_ClockSourceINT
Mcu.Pin4=PC1 Mcu.Pin4=PC1
Mcu.Pin40=VP_TIM17_VS_OPM Mcu.Pin40=VP_TIM16_VS_OPM
Mcu.Pin41=VP_TIM17_VS_ClockSourceINT
Mcu.Pin5=PC2 Mcu.Pin5=PC2
Mcu.Pin6=PC3 Mcu.Pin6=PC3
Mcu.Pin7=PA0 Mcu.Pin7=PA0
Mcu.Pin8=PA1 Mcu.Pin8=PA1
Mcu.Pin9=PA2 Mcu.Pin9=PA2
Mcu.PinsNb=41 Mcu.PinsNb=42
Mcu.ThirdPartyNb=0 Mcu.ThirdPartyNb=0
Mcu.UserConstants= Mcu.UserConstants=
Mcu.UserName=STM32G070RBTx Mcu.UserName=STM32G070RBTx
MxCube.Version=6.6.1 MxCube.Version=6.9.1
MxDb.Version=DB.6.0.60 MxDb.Version=DB.6.0.91
NVIC.ForceEnableDMAVector=true NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
@@ -96,6 +98,7 @@ NVIC.SavedPendsvIrqHandlerGenerated=true
NVIC.SavedSvcallIrqHandlerGenerated=true NVIC.SavedSvcallIrqHandlerGenerated=true
NVIC.SavedSystickIrqHandlerGenerated=true NVIC.SavedSystickIrqHandlerGenerated=true
NVIC.SysTick_IRQn=true\:3\:0\:false\:false\:false\:true\:false\:true\:false NVIC.SysTick_IRQn=true\:3\:0\:false\:false\:false\:true\:false\:true\:false
NVIC.TIM16_IRQn=true\:3\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.TIM17_IRQn=true\:3\:0\:false\:false\:true\:true\:true\:true\:true NVIC.TIM17_IRQn=true\:3\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.TIM6_IRQn=true\:3\:0\:false\:false\:true\:false\:false\:true\:true NVIC.TIM6_IRQn=true\:3\:0\:false\:false\:true\:false\:false\:true\:true
NVIC.TimeBase=TIM6_IRQn NVIC.TimeBase=TIM6_IRQn
@@ -189,11 +192,10 @@ PB6.Signal=USART1_TX
PB7.Locked=true PB7.Locked=true
PB7.Mode=Asynchronous PB7.Mode=Asynchronous
PB7.Signal=USART1_RX PB7.Signal=USART1_RX
PB9.GPIOParameters=GPIO_Speed,GPIO_Label PB9.GPIOParameters=GPIO_Label
PB9.GPIO_Label=BUZZER PB9.GPIO_Label=BUZZER
PB9.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
PB9.Locked=true PB9.Locked=true
PB9.Signal=GPIO_Output PB9.Signal=S_TIM17_CH1
PC1.GPIOParameters=GPIO_Label PC1.GPIOParameters=GPIO_Label
PC1.GPIO_Label=LCD_LED PC1.GPIO_Label=LCD_LED
PC1.Signal=S_TIM15_CH1 PC1.Signal=S_TIM15_CH1
@@ -252,12 +254,15 @@ ProjectManager.PreviousToolchain=STM32CubeIDE
ProjectManager.ProjectBuild=false ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=PCB-Heater.ioc ProjectManager.ProjectFileName=PCB-Heater.ioc
ProjectManager.ProjectName=PCB-Heater ProjectManager.ProjectName=PCB-Heater
ProjectManager.ProjectStructure=
ProjectManager.RegisterCallBack= ProjectManager.RegisterCallBack=
ProjectManager.StackSize=0x400 ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=STM32CubeIDE ProjectManager.TargetToolchain=STM32CubeIDE
ProjectManager.ToolChainLocation= ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=true ProjectManager.UnderRoot=true
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_TIM1_Init-TIM1-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_SPI2_Init-SPI2-false-HAL-true,6-MX_TIM17_Init-TIM17-false-HAL-true,7-MX_TIM15_Init-TIM15-false-HAL-true,8-MX_TIM14_Init-TIM14-false-HAL-true,9-MX_USART1_UART_Init-USART1-false-HAL-true ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_TIM1_Init-TIM1-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_SPI2_Init-SPI2-false-HAL-true,6-MX_TIM17_Init-TIM17-false-HAL-true,7-MX_TIM15_Init-TIM15-false-HAL-true,8-MX_TIM14_Init-TIM14-false-HAL-true,9-MX_USART1_UART_Init-USART1-false-HAL-true,10-MX_TIM16_Init-TIM16-false-HAL-true
RCC.ADCFreq_Value=64000000 RCC.ADCFreq_Value=64000000
RCC.AHBFreq_Value=64000000 RCC.AHBFreq_Value=64000000
RCC.APBFreq_Value=64000000 RCC.APBFreq_Value=64000000
@@ -289,6 +294,8 @@ SH.S_TIM14_CH1.0=TIM14_CH1,PWM Generation1 CH1
SH.S_TIM14_CH1.ConfNb=1 SH.S_TIM14_CH1.ConfNb=1
SH.S_TIM15_CH1.0=TIM15_CH1,PWM Generation1 CH1 SH.S_TIM15_CH1.0=TIM15_CH1,PWM Generation1 CH1
SH.S_TIM15_CH1.ConfNb=1 SH.S_TIM15_CH1.ConfNb=1
SH.S_TIM17_CH1.0=TIM17_CH1,PWM Generation1 CH1
SH.S_TIM17_CH1.ConfNb=1
SH.S_TIM1_CH1.0=TIM1_CH1,Input_Capture1_from_TI1 SH.S_TIM1_CH1.0=TIM1_CH1,Input_Capture1_from_TI1
SH.S_TIM1_CH1.1=TIM1_CH1,TriggerSource_TI1FP1 SH.S_TIM1_CH1.1=TIM1_CH1,TriggerSource_TI1FP1
SH.S_TIM1_CH1.ConfNb=2 SH.S_TIM1_CH1.ConfNb=2
@@ -311,19 +318,27 @@ TIM1.IPParameters=AutoReloadPreload,Prescaler,Period,BreakState,AutomaticOutput,
TIM1.OC2Preload_PWM=DISABLE TIM1.OC2Preload_PWM=DISABLE
TIM1.OCMode_PWM-PWM\ Generation2\ CH2=TIM_OCMODE_PWM2 TIM1.OCMode_PWM-PWM\ Generation2\ CH2=TIM_OCMODE_PWM2
TIM1.OCPolarity_2=TIM_OCPOLARITY_HIGH TIM1.OCPolarity_2=TIM_OCPOLARITY_HIGH
TIM1.Period=999 TIM1.Period=1000-1
TIM1.Prescaler=640-1 TIM1.Prescaler=640-1
TIM1.Pulse-PWM\ Generation2\ CH2=1020 TIM1.Pulse-PWM\ Generation2\ CH2=1020
TIM14.Channel=TIM_CHANNEL_1 TIM14.Channel=TIM_CHANNEL_1
TIM14.IPParameters=Channel TIM14.IPParameters=Channel,Prescaler,Period,Pulse
TIM14.Period=100-1
TIM14.Prescaler=10-1
TIM14.Pulse=100
TIM15.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM15.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1
TIM15.IPParameters=Channel-PWM Generation1 CH1,Prescaler,Period TIM15.IPParameters=Channel-PWM Generation1 CH1,Prescaler,Period
TIM15.Period=100-1 TIM15.Period=100-1
TIM15.Prescaler=320-1 TIM15.Prescaler=640-1
TIM16.IPParameters=Prescaler,Period
TIM16.Period=999
TIM16.Prescaler=64000-1
TIM17.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE TIM17.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE
TIM17.IPParameters=Prescaler,Period,AutoReloadPreload TIM17.Channel=TIM_CHANNEL_1
TIM17.Period=999 TIM17.IPParameters=Prescaler,Period,AutoReloadPreload,Channel,Pulse
TIM17.Prescaler=64000-1 TIM17.Period=14545-1
TIM17.Prescaler=10-1
TIM17.Pulse=7272
USART1.IPParameters=VirtualMode-Asynchronous USART1.IPParameters=VirtualMode-Asynchronous
USART1.VirtualMode-Asynchronous=VM_ASYNC USART1.VirtualMode-Asynchronous=VM_ASYNC
VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2 VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2
@@ -336,10 +351,12 @@ VP_TIM14_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM14_VS_ClockSourceINT.Signal=TIM14_VS_ClockSourceINT VP_TIM14_VS_ClockSourceINT.Signal=TIM14_VS_ClockSourceINT
VP_TIM15_VS_ClockSourceINT.Mode=Internal VP_TIM15_VS_ClockSourceINT.Mode=Internal
VP_TIM15_VS_ClockSourceINT.Signal=TIM15_VS_ClockSourceINT VP_TIM15_VS_ClockSourceINT.Signal=TIM15_VS_ClockSourceINT
VP_TIM16_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM16_VS_ClockSourceINT.Signal=TIM16_VS_ClockSourceINT
VP_TIM16_VS_OPM.Mode=OPM_bit
VP_TIM16_VS_OPM.Signal=TIM16_VS_OPM
VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer
VP_TIM17_VS_ClockSourceINT.Signal=TIM17_VS_ClockSourceINT VP_TIM17_VS_ClockSourceINT.Signal=TIM17_VS_ClockSourceINT
VP_TIM17_VS_OPM.Mode=OPM_bit
VP_TIM17_VS_OPM.Signal=TIM17_VS_OPM
VP_TIM1_VS_ClockSourceINT.Mode=Internal VP_TIM1_VS_ClockSourceINT.Mode=Internal
VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT
VP_TIM1_VS_ControllerModeCombinedResetTrigger.Mode=Combined_Reset_Trigger_Mode VP_TIM1_VS_ControllerModeCombinedResetTrigger.Mode=Combined_Reset_Trigger_Mode
@@ -347,4 +364,5 @@ VP_TIM1_VS_ControllerModeCombinedResetTrigger.Signal=TIM1_VS_ControllerModeCombi
VP_TIM1_VS_OPM.Mode=OPM_bit VP_TIM1_VS_OPM.Mode=OPM_bit
VP_TIM1_VS_OPM.Signal=TIM1_VS_OPM VP_TIM1_VS_OPM.Signal=TIM1_VS_OPM
board=custom board=custom
rtos.0.ip=FREERTOS
isbadioc=false isbadioc=false

BIN
images/CAD1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 450 KiB

BIN
images/pcb-heater-PCB1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
images/pcb-heater-PCB2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
kicad/pcb-heater/BOM.xlsx Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,6 @@
{ {
"board": { "board": {
"3dviewports": [],
"design_settings": { "design_settings": {
"defaults": { "defaults": {
"board_outline_line_width": 0.049999999999999996, "board_outline_line_width": 0.049999999999999996,
@@ -45,7 +46,7 @@
"silk_text_upright": false, "silk_text_upright": false,
"zones": { "zones": {
"45_degree_only": false, "45_degree_only": false,
"min_clearance": 0.127 "min_clearance": 0.19999999999999998
} }
}, },
"diff_pair_dimensions": [ "diff_pair_dimensions": [
@@ -63,20 +64,26 @@
"rule_severities": { "rule_severities": {
"annular_width": "error", "annular_width": "error",
"clearance": "error", "clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error", "copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error", "courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error", "diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error", "diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error", "drill_out_of_range": "error",
"duplicate_footprints": "warning", "duplicate_footprints": "warning",
"extra_footprint": "warning", "extra_footprint": "warning",
"footprint": "error",
"footprint_type_mismatch": "error", "footprint_type_mismatch": "error",
"hole_clearance": "error", "hole_clearance": "error",
"hole_near_hole": "error", "hole_near_hole": "error",
"invalid_outline": "error", "invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error", "item_on_disabled_layer": "error",
"items_not_allowed": "error", "items_not_allowed": "error",
"length_out_of_range": "error", "length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error", "malformed_courtyard": "error",
"microvia_drill_out_of_range": "error", "microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore", "missing_courtyard": "ignore",
@@ -86,9 +93,14 @@
"padstack": "error", "padstack": "error",
"pth_inside_courtyard": "ignore", "pth_inside_courtyard": "ignore",
"shorting_items": "error", "shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning", "silk_over_copper": "warning",
"silk_overlap": "warning", "silk_overlap": "warning",
"skew_out_of_range": "error", "skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error", "through_hole_pad_without_hole": "error",
"too_many_vias": "error", "too_many_vias": "error",
"track_dangling": "warning", "track_dangling": "warning",
@@ -97,7 +109,6 @@
"unconnected_items": "error", "unconnected_items": "error",
"unresolved_variable": "error", "unresolved_variable": "error",
"via_dangling": "warning", "via_dangling": "warning",
"zone_has_empty_net": "error",
"zones_intersect": "error" "zones_intersect": "error"
}, },
"rule_severitieslegacy_courtyards_overlap": true, "rule_severitieslegacy_courtyards_overlap": true,
@@ -107,18 +118,63 @@
"allow_microvias": false, "allow_microvias": false,
"max_error": 0.005, "max_error": 0.005,
"min_clearance": 0.19999999999999998, "min_clearance": 0.19999999999999998,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.19999999999999998, "min_copper_edge_clearance": 0.19999999999999998,
"min_hole_clearance": 0.254, "min_hole_clearance": 0.254,
"min_hole_to_hole": 0.5, "min_hole_to_hole": 0.5,
"min_microvia_diameter": 0.19999999999999998, "min_microvia_diameter": 0.19999999999999998,
"min_microvia_drill": 0.09999999999999999, "min_microvia_drill": 0.09999999999999999,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0, "min_silk_clearance": 0.0,
"min_text_height": 0.7999999999999999,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.19999999999999998, "min_through_hole_diameter": 0.19999999999999998,
"min_track_width": 0.19999999999999998, "min_track_width": 0.19999999999999998,
"min_via_annular_width": 0.13, "min_via_annular_width": 0.13,
"min_via_diameter": 0.45999999999999996, "min_via_diameter": 0.45999999999999996,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true "use_height_for_length_calcs": true
}, },
"teardrop_options": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 5,
"td_on_pad_in_zone": false,
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [ "track_widths": [
0.0, 0.0,
0.25, 0.25,
@@ -150,7 +206,8 @@
"zones_allow_external_fillets": false, "zones_allow_external_fillets": false,
"zones_use_no_outline": true "zones_use_no_outline": true
}, },
"layer_presets": [] "layer_presets": [],
"viewports": []
}, },
"boards": [], "boards": [],
"cvpcb": { "cvpcb": {
@@ -334,18 +391,23 @@
"rule_severities": { "rule_severities": {
"bus_definition_conflict": "error", "bus_definition_conflict": "error",
"bus_entry_needed": "error", "bus_entry_needed": "error",
"bus_label_syntax": "error",
"bus_to_bus_conflict": "error", "bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error", "bus_to_net_conflict": "error",
"conflicting_netclasses": "error",
"different_unit_footprint": "error", "different_unit_footprint": "error",
"different_unit_net": "error", "different_unit_net": "error",
"duplicate_reference": "error", "duplicate_reference": "error",
"duplicate_sheet_names": "error", "duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error", "extra_units": "error",
"global_label_dangling": "warning", "global_label_dangling": "warning",
"hier_label_mismatch": "error", "hier_label_mismatch": "error",
"label_dangling": "error", "label_dangling": "error",
"lib_symbol_issues": "warning", "lib_symbol_issues": "warning",
"missing_bidi_pin": "warning",
"missing_input_pin": "warning",
"missing_power_pin": "error",
"missing_unit": "warning",
"multiple_net_names": "warning", "multiple_net_names": "warning",
"net_not_bus_member": "warning", "net_not_bus_member": "warning",
"no_connect_connected": "warning", "no_connect_connected": "warning",
@@ -355,6 +417,7 @@
"pin_to_pin": "warning", "pin_to_pin": "warning",
"power_pin_not_driven": "error", "power_pin_not_driven": "error",
"similar_labels": "warning", "similar_labels": "warning",
"simulation_model_issue": "error",
"unannotated": "error", "unannotated": "error",
"unit_value_mismatch": "error", "unit_value_mismatch": "error",
"unresolved_variable": "error", "unresolved_variable": "error",
@@ -372,7 +435,7 @@
"net_settings": { "net_settings": {
"classes": [ "classes": [
{ {
"bus_width": 12.0, "bus_width": 12,
"clearance": 0.2, "clearance": 0.2,
"diff_pair_gap": 0.25, "diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25, "diff_pair_via_gap": 0.25,
@@ -386,13 +449,15 @@
"track_width": 0.25, "track_width": 0.25,
"via_diameter": 0.6, "via_diameter": 0.6,
"via_drill": 0.3, "via_drill": 0.3,
"wire_width": 6.0 "wire_width": 6
} }
], ],
"meta": { "meta": {
"version": 2 "version": 3
}, },
"net_colors": null "net_colors": null,
"netclass_assignments": null,
"netclass_patterns": []
}, },
"pcbnew": { "pcbnew": {
"last_paths": { "last_paths": {
@@ -408,6 +473,8 @@
"schematic": { "schematic": {
"annotate_start_num": 0, "annotate_start_num": 0,
"drawing": { "drawing": {
"dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0,
"default_line_thickness": 6.0, "default_line_thickness": 6.0,
"default_text_size": 50.0, "default_text_size": 50.0,
"field_names": [], "field_names": [],
@@ -439,7 +506,11 @@
"page_layout_descr_file": "", "page_layout_descr_file": "",
"plot_directory": "", "plot_directory": "",
"spice_adjust_passive_values": false, "spice_adjust_passive_values": false,
"spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"", "spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true,
"spice_save_all_currents": false,
"spice_save_all_voltages": false,
"subpart_first_id": 65, "subpart_first_id": 65,
"subpart_id_separator": 0 "subpart_id_separator": 0
}, },

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff