tag 标签: stm32

相关帖子
相关博文
  • 热度 1
    2022-9-3 19:24
    202 次阅读|
    0 个评论
    首先先来了解一下TMC5160的3种工作模式 TMC5160通过两个引脚来控制它的工作模式:SD_MODE和SPI_MODE。 1、当SD_MODE接地,SPI_MODE拉高,TMC5160即工作在模式1(SPI控制模式)。在该模式下,用户通过SPI接口来设置TMC5160的寄存器。 TMC5160使用自己的梯形曲线发生器来控制步进电机转动,用户需要设置:开始运动速度VSTART、第一段折线末速度V1、最大速度VMAX、停止速度VSTOP、第一段折线的加速度A1、第二段折线加速度AMAX、第四段折线的减速度DMAX、第五段折线的减速度D1。把上面的参数设置好,再设置工作模式:速度模式和位置模式。最后再设置目标位置。 如果是速度模式运行,不需要设置目标位置,电机就会开始转动。如果是位置模式,则需要设置目标位置,且目标位置与电机当前位置值不同电机才会转动。下图中的红线是电机的实际速度,不管是速度模式还是位置模式,电机的运行过程会按照下图来进行。 2、当SD_MODE接高电平,SPI_MODE拉高,TMC5160工作在模式2(SPI+S/D)。在该模式下,用户通过SPI接口来设置TMC5160的寄存器。TMC5160的功能和DRV8825类似,外界通过脉冲和方向引脚来控制步进电机运动。 3、当SD_MODE接高电平,SPI_MODE接地,TMC5160工作在模式3(S/D独立模式)。在该模式下,SPI接口失能,TMC5160的工作状态由CFG引脚配置,外界通过脉冲和方向引脚来控制步进电机运动。TMC5160可以完全独立工作,不需要接CPU。 目前是实现电机的简单转动,下面将用模式三来控制电机。 该模式下不需要通过SPI通讯,配置相关GPIO引脚和发送频率一定的正弦波即可。TMC5160的GPIO和STM32的引脚对应如下表: 先将SD_MODE接地,SPI_MODE拉高(PB1=1,PB=0),进入独立模式。 其它引脚的参数可以参考TMC5160数据手册根据自己的需求进行设置。初始化程序如下: void TMC5160_Init3(void) //模式三独立模式 { GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIOA时钟 GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8; GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速 HAL_GPIO_Init(GPIOA,&GPIO_Initure); GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //高速 HAL_GPIO_Init(GPIOB,&GPIO_Initure); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6|GPIO_PIN_5,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14|GPIO_PIN_13|GPIO_PIN_12|GPIO_PIN_1,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15|GPIO_PIN_2|GPIO_PIN_0,GPIO_PIN_RESET); } 然后PA8需要输出PWM方波,方波的频率决定电机转动速度,可以用PWM通道的方式搞定,也可以用定时器中断来做,这边采用定时器中断的方法, 例如,STM32F103的时钟频率为72M,分频设为72,装载值设为500,每0.5ms中断一次,PA8电平取反,1KHZ的方波就完成了。频率可以改变。程序如下: void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim==(&TIM3_Handler)) { COUNT++; A8=~A8; =6400) { //HAL_NVIC_DisableIRQ(TIM3_IRQn); LED=1; //转一圈,停2s后继续 delay_ms(2000); LED=0; COUNT=0; } } } 实现的功能是让电机转1圈后停2s后继续。 采用四相电机,脉冲数控制电机转多少,电机步距角位1.8°,一个脉冲转1.8°,200个脉冲一圈,采用16细分,那么一圈就需要3200个脉冲。 电机转动的速度就由脉冲频率决定,可以根据细分及脉冲频率来换算电机实际转速。
  • 热度 6
    2022-8-8 10:57
    1556 次阅读|
    1 个评论
    MCU内部温度传感器的关键特性及应用事项
    大多数32位MCU都有一项非常实用的功能——内部集成了一个温度传感器,这个温度传感器产生一个随温度线性变化的电压VTS。因为是内置, 测试的当然是芯片内部温度, 这对控制芯片发热和保障MCU健康运行非常重要。对于一些恶劣的应用环境,可以通过检测芯片内部而感知设备的工作环境温度, 如果温度过高或者过低,就触发进入睡眠状态或者停止运转,以提高设备运行的可靠性。 图1. AT32单片机芯片内含温度传感器 如果芯片外接负载不变,那么芯片的发热也基本稳定,相对于外界的温度而言,温度变化值也是基本稳定的。就是说,也可以用MCU芯片的内置传感器来测量外界环境的温度。以下以AT32 MCU为例,说明内置温度传感器应用和评估测试方法,并提供测试数据供使用者设计参考。 内部传感器特性 AT32单片机芯片内含温度传感器,它产生一个随温度线性变化的电压,在内部被连接到ADC1_IN16的输入通道上,用于将传感器的输出转换到数字数值。 图2. AT32 MCU的温度传感器特性 以AT32F413为例,只要遵守以下公式,即可求得目前温度传感器量测出的温度: 温度(°C) = {(V25 - VSENSE) / Avg_Slope} + 25 这里:V25 = VSENSE在25 °C时的数值,Avg_Slope = 温度与VSENSE曲线的平均斜率(单位为mV/°C),VSENSE为温度传感器经由ADC转换出的电压换算成mV,再依照上述公式,只要将V25带入典型值1280mV,Avg_Slope带入-4.20mV/°C即可求得。 图3为套用典型值计算出的温度与传感器输出电压(VSENSE)的特性曲线。 图3. VSENSE对温度理想曲线图 应用此温度传感器需注意因生产过程的变化,每个芯片的温度传感器V25具有相对大的偏移,若以Avg_Slope典型值来换算相当于47.6°C,最小值与最大值一般会有最多200mV的误差。因此,内部温度传感器更适合于检测温度的变化,而不是测量绝对的温度。 内部温度传感器的使用 AT32芯片的温度传感器在内部被连接到ADC1_IN16的输入通道上,用于将传感器的输出转换到数字数值。这个数值为温度的变化数,而非绝对温度。 AT32芯片温度传感器为内部弱电压源,ADC进行采样时需要足够时间让VSENSE输出为采样电路达到充放电平衡而稳定,使用者需确实遵照数据手册中的TS_TEMP参数为内部温度传感器设置足够的采样时间,以获得正确的转换数值。 在3.6V、3.3V和2.6V操作电压下,不同AT32温度传感器的Avg_Slope在各电压条件下几乎一致。但细部分析,就发现各芯片V25参数之间具有相对较大的差异,这是造成AT32温度传感器量测与实际温度徧差的主要原因。若以软件校正偏移量(offset)后或仅作为相对温度量测时,在芯片全温度-40到105°C操作范围内,温度误差(线性度)可以达到±2°C之内。 但若未做偏移校正或用以量测绝对温度,因温度传感器本身架构于芯片生产过程的变化,温度变化曲线的偏移在不同芯片上会有明显差异。因此,建议AT32芯片内部温度传感器仅用作检测温度的变化,而不是测量绝对的温度。如果需要测量精确的温度值,应该使用一个外置的温度传感器。
  • 2022-7-7 10:42
    466 次阅读|
    0 个评论
    用apm32f003替换STM32进行低成本系统开发
    STM32F003是基于Arm Cortex-M0内核的32位MCU,工作电压为2.4-3.6V,主频48MHz,内置16KB Flash、定时器、ADC、通信接口。由于STM32货源紧张,国产替代方案持续火热,APM32F003系列MCU就是最有利的竞品。 APM32F003系列主频与STM32F003一致,12-bit ADC的高精度表现可匹敌STM32F003,工作电压2.0~5.5V比后者更宽泛。APM32F003还整合了增强型实时控制能力与丰富的外设,包括3路UART、1路SPI、1路I2C,可输出PWM脉冲控制信号至全桥驱动芯片,从而驱动MOS管对电平进行转换和功率放大。 图1. APM32F003 MINI电路图 在高温情况下,APM32F003系列的高阶ADC可全面提升无线充的多样化控制和通信需求,可实现对STM32F003系列的pin-pin替代,助力低成本高性能的无线产品开发。 图2. APM32F003 MINI开发板 APM32F003兼具小体积PCB布线优势,工作温度-40~+105℃,外接的晶体谐振器(Y2)频率为8MHz、PA2 / OSCOUT 6两个匹配电容20pF。 图3. APM32F003参考BOM表 APM32F003 MINI板带有1个USB接口,1个KEY,2个LED,1个RESET KEY复位键,1个SWD接口,12个GPIO。由于自带高精度12位ADC,可实现动态高精度实时采样,灵活便捷、兼容性强,方便快速开发。
  • 热度 2
    2022-6-2 09:08
    416 次阅读|
    0 个评论
    用DS18B20温度传感器和STM32蓝丸板实现远程测温
    这可能是最简单的STM32项目了,整个BOM只有DS18B20温度传感器、STM32蓝丸板和一个最平常的4.7k电阻器,外加一款面包板和几根杜邦线。也许有人说这简直就是浪费STM32资源,我说这是入门砖,了解了基本原理后面就是缤纷世界。 DS18B20智能型防水温度传感器 DS18B20是一款智能型防水温度传感器,用于测量-55 to 125°C之间液体温度。由于每个DS18B20包含一个独立IP序列号,多个DS18B20可共用同一条1-Wire总线。 DS18B20可以分别在93.75ms和750ms内完成9位和12位的数字量,信息读出或写入仅需要一根口线(单线接口)读写,温度变换功率来源于数据总线,总线本身也可以向所挂接的DS18B20供电,而无需额外电源。 DS18B20传感器带有电缆和防水功能,可用来方便的测量潮湿环境,即使远距离测量也不会导致信号衰减,测量精度可达±0.5°C。DS18B20集成有12 bits ADC,可通过一个简单的数字引脚与任何MCU接口。 DS18B20传感器的不足之处是采用的Dallas 1-Wire协议有些复杂,需要较多代码才能通信。使用中,还要采用一个4.7k电阻器从VCC对数据进行上拉。 DS18B20与STM32F103C接口 DS18B20与STM32F103C蓝丸板的接口电路很简单,传感器由STM32蓝丸的3.3V引脚供电,GND引脚与蓝丸GND连接。数字引脚经过4.7K电阻器上拉后,连接于蓝丸板的PA8引脚。 DS18B20数字温度计提供9-12位(可编程设备温度读数)。由于DS18B20是单线通信,与STM32F103C MCU连接只有一条线,读写以及温度转换所需能量也可以从数据线本身获得。 DS18B20 -STM32代码 让STM32蓝丸板读取DS18B20感测的温度信息,可以各种方法上传如下代码,例如使用USB-TTL转换器模块以串口上传。 int DSPIN = PA8; void setup() { // put your setup code here, to run once: Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: double temp = TempRead(); temp = temp * 0.0625; // conversion accuracy is 0.0625 / LSB Serial.print("Temperature: "); Serial.print(temp); Serial.println(" °C"); Serial.println(""); delay(500); } boolean DS18B20_Init() { pinMode(DSPIN, OUTPUT); digitalWrite(DSPIN, HIGH); delayMicroseconds(5); digitalWrite(DSPIN, LOW); delayMicroseconds(750);//480-960 digitalWrite(DSPIN, HIGH); pinMode(DSPIN, INPUT); int t = 0; while (digitalRead(DSPIN)) { t++; 60) return false; delayMicroseconds(1); } t = 480 - t; pinMode(DSPIN, OUTPUT); delayMicroseconds(t); digitalWrite(DSPIN, HIGH); return true; } void DS18B20_Write(byte data) { pinMode(DSPIN, OUTPUT); for (int i = 0; i < 8; i++) { digitalWrite(DSPIN, LOW); delayMicroseconds(10); if (data & 1) digitalWrite(DSPIN, HIGH); else digitalWrite(DSPIN, LOW); = 1; delayMicroseconds(50); digitalWrite(DSPIN, HIGH); } } byte DS18B20_Read() { pinMode(DSPIN, OUTPUT); digitalWrite(DSPIN, HIGH); delayMicroseconds(2); byte data = 0; for (int i = 0; i < 8; i++) { digitalWrite(DSPIN, LOW); delayMicroseconds(1); digitalWrite(DSPIN, HIGH); pinMode(DSPIN, INPUT); delayMicroseconds(5); = 1; if (digitalRead(DSPIN)) data |= 0x80; delayMicroseconds(55); pinMode(DSPIN, OUTPUT); digitalWrite(DSPIN, HIGH); } return data; } int TempRead() { if (!DS18B20_Init()) return 0; DS18B20_Write (0xCC); // Send skip ROM command DS18B20_Write (0x44); // Send reading start conversion command if (!DS18B20_Init()) return 0; DS18B20_Write (0xCC); // Send skip ROM command DS18B20_Write (0xBE); // Read the register, a total of nine bytes, the first two bytes are the conversion value int temp = DS18B20_Read (); // Low byte temp |= DS18B20_Read () << 8; // High byte return temp; } 上述代码上传后,Serial Monitor就开始显示被测环境的的温度数值。
  • 热度 4
    2022-5-17 08:53
    842 次阅读|
    0 个评论
    如何触发STM32F103C8T6的外部中断?
    中断是MCU的特征之一,STM32F103C8T6也不例外。以下通过STM32F103C8T6 Blue Pill外接一个按钮,向MCU触发外部中断。 STM32F103C8T6中断特征 中断有硬件中断和软件中断两种,当一个中断发生时,相应的中断服务程序(ISR)和中断处理程序就开始运行了。其中,ISR的指令必须尽可能小,ISR中也不能出现delay ()之类的阻塞函数。 STM32 Blue Pill或者STM32F103C8T6 MCU指定NVIC来管理所有外部中断和外设中断,其应用采用了Arduino IDE。因此,我们可使用相同的句法来配置外部中断,这可通过以下称作 “attachInterrupt ()” 的句法给出: attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); 该句法的第一个参数 digitalPinToInterrupt(pin) 代表预期外部中断的MCU引脚,例如,如果按钮连接于PA0,该参数就变成“digitalPinToInterrupt(PA0)”。 第二个参数是ISR函数,该函数必须具有 void 返回类型,不能代任何参数。 第三个函数是是触发中断的模式,例如,信号突变到哪个点位时,必须触发一个中断。Arduino环境下,该参数通常为5个用户预定义的常数,但STM32须从如下3个选项中选取: CHANGE: 在引脚数值改变时触发中断。 RISING: 当引脚数值从LOW 上升到 HIGH 时触发中断。 FALLING: 当引脚数值从 HIGH 回落到 LOW 时触发中断。 用按钮为STM32 MCU触发一个中断 本项目所需元件包括:STM32F103C8T6蓝丸版、按钮、USB-UART转换器、USB电缆,杜邦线。 首先,将按钮连接到 PA0 引脚,并通过一个4.7KΩ电阻器上拉到HIGH ,另一引脚接 GND。 以下代码用以激励 PA0 引脚的中断,button_ISR用来切换LED。 int ledPin = PC13; int buttonPin = PA0; int ledToggle; int previousState = HIGH; unsigned int previousPress = 0; volatile int buttonFlag; int buttonDebounce = 20; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); attachInterrupt(digitalPinToInterrupt(buttonPin), button_ISR, CHANGE); } void loop() { buttonDebounce && buttonFlag) { previousPress = millis(); if(digitalRead(buttonPin) == LOW && previousState == HIGH) { ledToggle =! ledToggle; digitalWrite(ledPin, ledToggle); previousState = LOW; } else if(digitalRead(buttonPin) == HIGH && previousState == LOW) { previousState = HIGH; } buttonFlag = 0; } } void button_ISR() { buttonFlag = 1; } 本项目演示了STM32F103C8T6 Blue Pill外部中断的操作,每按一次按钮就触发一次中断,STM32 MCU就执行一次简单ISR,返回来切换LED状态。
相关资源