STM32单片机学习手记

发布者:WhisperingSoul最新更新时间:2012-10-26 来源: 21ic 关键字:STM32  串口  PWM  定时器 手机看文章 扫描二维码
随时随地手机看文章

  STM学习笔记——用定时器实现荧火虫灯

  在第6篇笔记中,我用软件延时的方法实现了荧火虫,学了定时器,当然就要用一用定时器了,这里仍是用荧火虫灯为例。

  用ST库所带的例子Tim中的TimBase为例来修改,这个例子的位置以及如何建立工程请参考第7篇笔记,这里就不再重复了,下面简述一下修改的过程。

  (1) 由于我的板子上的灯是由PD8~PD11来控制的,因此,要将

  void RCC_Configuration(void)

  中的:

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //打开GPIOC的时钟

  改为

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打开GPIOD的时钟

  (2) 将四个通道全部设置为TIM_OCMode_Toggle模式,即将

  /* Output Compare Timing Mode configuration: Channel1 *

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;

  改为:

  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;

  (3)例子中原来中断产生的频率很低,是不适合于做这种荧火虫灯的,但为了比较,我只改了最后一个值:

  __IO uint16_t CCR4_Val = 8192;改为

  __IO uint16_t CCR4_Val = 2048;

  这样,这个通道的中断频率变为

  CC4 update rate = TIM2 counter clock / CCR4_Val = 3515.6 Hz

  (4) 到stm32f10x_it.c中作修改中断处理函数如下:

  uint8_t allCount=16;

  uint8_t upDown1,upDown2,upDown3,upDown4;

  void TIM2_IRQHandler(void)

  { static uint8_t Count1,Count2,Count3,Count4;

  static uint8_t hCnt1,hCnt2,hCnt3,hCnt4;

  if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)

  {

  TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

  if(Count1《hCnt1)

  { GPIO_SetBits(GPIOD, GPIO_Pin_8); //点亮灯

  }

  else

  { GPIO_ResetBits(GPIOD, GPIO_Pin_8); //熄灭灯

  }

  Count1++;

  if(Count1》=allCount)

  { Count1=0;

  if(upDown1)

  { hCnt1++;

  if(hCnt1》=(allCount-1))

  upDown1=!upDown1;

  }

  else

  { hCnt1--;

  if(hCnt1《2)

  upDown1=!upDown1;

  }

  }

 capture = TIM_GetCapture1(TIM2);

  TIM_SetCompare1(TIM2, capture + CCR1_Val);

  }

  else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)

  {

  TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

  if(Count2《hCnt2)

  { GPIO_SetBits(GPIOD, GPIO_Pin_9); //点亮灯

  }

  else

  { GPIO_ResetBits(GPIOD, GPIO_Pin_9); //熄灭灯

  }

  Count2++;

  if(Count2》=allCount)

  { Count2=0;

  if(upDown2)

  { hCnt2++;

  if(hCnt2》=(allCount-1))

  upDown2=!upDown2;

  }

  else

  { hCnt2--;

  if(hCnt2《2)

  upDown1=!upDown1;

  }

  }

  capture = TIM_GetCapture2(TIM2);

  TIM_SetCompare2(TIM2, capture + CCR2_Val);

  }

  else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)

  {

  TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);

  if(Count3《hCnt3)

  { GPIO_SetBits(GPIOD, GPIO_Pin_10); //点亮灯

  }

  else

  { GPIO_ResetBits(GPIOD, GPIO_Pin_10); //熄灭灯

  }

  Count3++;

  if(Count3》=allCount)

  { Count3=0;

  if(upDown3)

  { hCnt3++;

  if(hCnt3》=(allCount-1))

  upDown3=!upDown3;

  }

  else

  { hCnt3--;

  if(hCnt3《2)

  upDown3=!upDown3;

  }

  }

  capture = TIM_GetCapture3(TIM2);

  TIM_SetCompare3(TIM2, capture + CCR3_Val);

  }

  else

  {

  TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);

  if(Count4《hCnt4)

  { GPIO_SetBits(GPIOD, GPIO_Pin_11); //点亮灯

  }

  else

  { GPIO_ResetBits(GPIOD, GPIO_Pin_11); //熄灭灯

  }

  Count4++;

  if(Count4》=allCount)

  { Count4=0;

  if(upDown4)

  { hCnt4++;

  if(hCnt4》=(allCount-1))

  upDown4=!upDown4;

  }

  else

  { hCnt4--;

  if(hCnt4《2)

  upDown4=!upDown4;

  }

  }

  capture = TIM_GetCapture4(TIM2);

  TIM_SetCompare4(TIM2, capture + CCR4_Val);

  }

  }

  即将LED点亮的过程分成16(allCount)份,第一次是点亮1/16时间,而15/16的时间都是灭着的,这个1是变量hCnt来控制的,随着中断16次完毕,hCnt会加1,于是第二个周期来了,在这个周期中,LED会被点亮2/16,而14/16的时间是灭着的,依次类推,到最后会有 15/16的时间被点亮,而1/16的时间是灭着的,于是就产生了渐亮效果。请原谅我在学习时的代码写得很粗糙了。

  由于TIM2_CH1通道的中断频率是:

  CC1 update rate = TIM2 counter clock / CCR1_Val = 146.48 Hz

  再除以16那就是:9.1Hz,闪烁现像应该很明显了。[page]

  将代码写入芯片,事实确实是TIM2_CH1(146.48Hz)和TIM2_CH2(219.7Hz)的闪烁极明显,几乎看不出渐亮的过程,亮度高时几乎全亮,亮度低时一阵狂闪。而TIM2_CH4则效果十分明显,达到了预计的要求。TIM2_CH3(439.4)呢,则介于两者之间,可以看出渐亮和渐灭的效果,但是也有很明显的闪烁效应。但在示波器(传统示波器)上,却是TIM2_CH3的效果最好,逐渐伸缩的PWM波形看得清清楚楚。

  接下来就要研究TIM的PWM方式了,用PWM方式来实现同样的功能,应该很有趣。

  STM32学习笔记——用PWM做个正弦波发生器

  一、用PWM的方法实现荧火虫灯

  上次提到要用Timer的PWM功能来实现荧火虫灯。当然还是找一个现成的例子来作个修改,这回要用到的例子在这里。

  1.jpg

  复制一份到自己练习用的文件夹中,建立工程。

  

  先阅读readme.txt及源程序,了解一些基本信息。

  从程序中可以知道:

  (1) 使用TIM3

  (2) 定时器的时钟频率是36MHz.

  (3) PWM信号的频率是36KHz,这是通过TIM3的ARR来设置的。ARR的值是999,因此PWM的频率是36MHz/(999+1)=36KHz。

  (4) 四个通道的占空比分别由TIM3_CCR1~TIM3_CCR4来确定,算式是:

  (TIM3_CCR1/ TIM3_ARR)* 100

  由此,当PWM的频率是36K时,占空比分辨率接近0.1%。降低频率,可以获得更高的分辨率。

  要完成灯的渐亮和渐灭控制,只要定时改变TIM3_CCR1的值就行了。

  如何改变呢?这里用到STM32提供的系统定时器(SysTick)

  数据手册中关于这个定时器的描述如下:

  -------------------------------------------------------------

系统时基定时器

  这个定时器是专用于实时操作系统,也可当成一个标准的递减计数器。它具有下述特性:

  ● 24位的递减计数器

  ● 自动重加载功能

  ● 当计数器为0时能产生一个可屏蔽系统中断

  ● 可编程时钟源

  而它的使用方法可以在库提供的例子中找到。

  有一个初始化函数:

  void SysTick_Configuration(void)

  {

  if (SysTick_Config((SystemFrequency) / 10)) //经实际测试发现,除以10是100ms,除以100是10ms,依此类推

  {

  /* Capture error */

  while (1);

  }

  NVIC_SetPriority(SysTick_IRQn, 0x0);

  }

  这里将其初始化为每100ms产生一次中断。

  将这个函数放在main.c中,在main函数中调用它,即完成初始化工作。在system32_it.c中有中断处理函数。

  void SysTick_Handler(void)

  {}

  原例子中这里没有写代码,可以根据需要自行增加相关代码来处理每100ms时间到的事件。

  代码如下:

  extern uint16_t dutyRatio;

  extern uint8_t ChangDuty;

  void SysTick_Handler(void)

  { static uint8_t Counter;

  if(Counter》16)

  dutyRatio-=62;

  else

  { dutyRatio+=62;

  if(dutyRatio》999)

  dutyRatio=999;

  }

  if(++Counter》=32)

  Counter=0;

  ChangDuty=1;

  }

  这里定义了两个变量,一个是dutyRatio,用来控制占空比的变化。它在main.c中定义,并初始化为6。初始化TIM3_CH1通道时使用该变量。

  

  每次中断则视情况增加或者减少,每次变化的量是62。在SysTick_Handler函数中,定义了一个static型的变量Counter,它的值在 0~31之间变化。当其值在0~15之间时,dutyRatio每次加1,这样一共是加16次,即其最终的值是:6+16*62=998,正好比ARR的值小1。当Counter的值在16~31之间变化时,dutyRatio每次减62。这样,dutyRatio的值始终在6~998之间变化,对应的是占空比在:

  6/999*100%=0.6% ~ 998/999*100%=99.89% 之间变化。

  ChangDuty是一个标志,用途是通知main函数,占空比已发生变化,要求更新CCR1。Mina函数的处理如下:

  while (1)

  { if(ChangDuty==1)

  {

  TIM3-》CCR1=dutyRatio;

  ChangDuty=0;

  }

  }

  在用软件仿真时,执行到TIM3-》CCR1=dutyRatio;时,外围部件中的相应值并没有立即变化。目前还没有弄清楚是调试器的问题还是确实不立即发生变化。

  1副本.jpg

  使用硬件来测试,由于我手边的板子TIM3_CH1上没有接LED,所以就看不出灯亮的效果了,不过,不要紧,还有示波器。将程序下载入FLASH后运行,观察GPIOA.6,可以看到非常漂亮的波形。用万用表电压档测该引脚的电压,可以看到电压平稳地上升和下降。所以,我有些怀疑上面提到的那个CCR1没有立即变化仅仅只是调试器的问题。//蓝色的字这个不对,下面有说明。

二、用PWM生成正弦波

  有了PWM,自然就可以用PWM的方法生成正弦波了。下面生成500Hz正弦波的方法参考自张明峰的《PIC单片机入门与实践》

  每个正弦波分成四个像限,每个像限16点,共64点,每点出现2个PWM周期,故PWM的周期为:2ms/128=156.25us,频率为64KHz。

  TIM3 Frequency = TIM3 counter clock/(ARR + 1)

  倒过来:

  ARR=TIM3 Counter Clock/TIM3 Frequenc - 1 =562.5-1 =561

  如果取ARR的值是561的话,那么实际的频率是64.056KHz,即最终生成为的正弦波频率是:500.4Hz

  有了ARR,占空比就取决于CCR1的值了,使用EXCEL可以方便地计算出第一象限的16个点的数据:

  280,307,335,361,387,412,436,458,478,496,513,527,539,548,555,559

  有了第一象限,其他象限都可以镜像生成了。具体方法请看源程序。

  要用上面的例子修改,还需要做一些工作。

  前面是在SysTick中做出标志,然后在主程序中修改CCR1的值,现在不行了,肯定会有时间的误差,不能这做么,要在PWM输出后修正,这样就要在PWM波形输出时产生中断。因此,需要在main函数中增加以下这个函数。

  1.jpg

  这个函数哪里来的呢,很简单,从timebase工程中中抄来的然后将TIM2改成TIM3就行了^_^。然后在main函数中调用它。

  注意,还需要打开stm32f10x_conf.h文件,将下面:

  

  蓝色框里面的包含文件给“解放”出来。当然,同时要把库中的misc.c源程序文件加入工程中来。否则,编译是通不过的。

  为了让通道1可以产生中断,还需要做一件事,就是下面蓝色的部分。

  /* TIM IT enable */

  TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);

  //也是从TIMEBASE工程中抄来,再将TIM2改成TIM3的。

  /* TIM3 enable counter */

  TIM_Cmd(TIM3, ENABLE);

  现在该到stm32f10x_it.c中去了,增加一个中断处理函数:

  uint16_t sinTab[]={280,307,335,361,387,412,436,458,478,496,513,527,539,548,555,559};

  uint8_t Count1,Count2; //1.像限计数器,其值在0~3之间变化 2.其值在0~31之间变化

  void TIM3_IRQHandler(void)

  {

  if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)

  {

  TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);

  if(Count2%2==0) //准备更新,新的值会在下一次更新

  { switch(Count1)

  { case 0: //象限1

  {

  TIM3-》CCR1= sinTab[Count2/2];

  break;

  }

  case 1: //象限2

  { TIM3-》CCR1=sinTab[15-Count2/2];

  break;

  }

  case 2: //象限3

  { TIM3-》CCR1=560-sinTab[Count2/2];

  break;

  }

  case 3: //象限4

  { TIM3-》CCR1=560-sinTab[15-Count2/2];

  break;

  }

  default:break;

  }

  }

  }

  if(++Count2==32)

  { Count2=0;

  if(++Count1==4)

  Count1=0;

  }

  }

[page]

  也就是在这里,搞清楚了,所谓的“我有些怀疑上面提到的那个CCR1没有立即变化仅仅只是调试器的问题”不对,这是CCR1更新方法的问题,

  

  注意上图中红色框中的描述。

  这里就是不用立即更新的方法。因为每个点的PWM波形会出现2次,因此,用

  if(Count2%2==0) 来判断是第一次产生PWM波形,更新CCR1,但是这个CCR1不会立即更新,而会在下一次产生PWM事件时更新。

STM32学习笔记——修修改改玩串口

  

  还是原来的风格,找个例子来玩。但是这次的printf这个例子有点不一样,它依赖于ST自己的EV板子,所以要用到的东西多一些了。除了上图所示的文件以外,还要把

  3副本.jpg

  这里的stm32_eval.c,stm32_eval.h文件,以及图中所示三个文件夹中任意一个文件夹中的部分文件复制到第一个图所示的文件夹中去,这里我们选择stm3210e_eval这个文件夹。

  2.gif

  需要复制的文件是stm3210e_eval.h

  如同前面一样建立工程,并且注意修改stm32_eval.h的内容

  

  将//#define USE_STM3210E_EVAL 前的#去掉。

  这样,就可以编译并通过文件,用软件仿真,在usart #1窗口显示出

  USART Printf Example: retarget the C library printf function to the USART

  这样一行字了。

  显然,对这样的玩法我是不会满意的,下面试着去掉与stm32e_eval等相关文件,把这里面需要用到的函数直接复制到main中去,同时,也了解一些串口设置的知识。

  学到这里,多少有点明白了,STM提供的库为了达到通用性的要求,用了很多的符号来替代常量,然后七转八拐,有时不知要转多少个弯才能找到最终对寄存器操作的代码。这时,keil提供的符号浏览就很有用处了。方法是在将光标移到需要查看的符号上面,按下F12即可,通常可以直接跳转到所需查看到的符号的出处。如下图

  

  将光标移到USART_BaudRate处,按下F12,即跳转到stm32f10x_uart.h文件中相应的定义处:

  

  如果stm32f10x_uart.h文件没有打开,那么这个动作会自动打开这个文件。

  下面我们将eval板相关的函数复制到main函数中,以便丢掉与eval板相关的文件。

  (1)打开stm32_eval.h文件,将

  typedef enum

  {

  COM1 = 0,

  COM2 = 1

  } COM_TypeDef;

  复制到main.c中,这是用来选择哪一个串口的,因为我的板子上也有2个串口,所以就把它复制过来,也省得对函数作较大的修改了。

  (2)打开stm32_eval.c文件,有一个

  void STM_EVAL_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct)

  的函数,是用来初始化端口的,我们把它复制到main.c中,并且把它改名为

  void STM_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct)

  去掉中间的eval。

  当然,在main函数中调用这个函数的地方也要做相应的修改。

  1.gif

  这个函数中用到了如上图中蓝色框中的一些符号,又是一系列的转换,用刚才所说的跟踪方法,找到这些符号的原始出处,作出修改,最后得到的STM_COMInit函数如下:

  void STM_COMInit(COM_TypeDef COM, USART_InitTypeDef* USART_InitStruct)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  /* 打开UART所用到的GPIO引脚的时钟*/

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

  /* 打开UART的时钟*/

  if (COM == COM1)

  {

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

  }

  else //COM=COM2

  {

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

  }

  /* 配置TX引脚为推挽式输出 */

  if(COM==COM1)

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;

  else

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* 配置RX引脚为浮动输入(高阻?) */

  if(COM==COM1)

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;

  else

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* 串行口配置*/

  if(COM==COM1)

  USART_Init(USART1, USART_InitStruct);

  else

  USART_Init(USART2, USART_InitStruct);

  /* 串口允许*/

  if(COM==COM1)

  USART_Cmd(USART1, ENABLE);

  else

  USART_Cmd(USART2, ENABLE);

  }

  至此,修改基本结束,在工程中移去stm32_eval相关的各个文件,在APP文件夹中将这些文件删除,关闭工程,再重新打开工程,编译通过,运行通过。

下面对上述初始化工作做一些解读,当然,少不了要数据手册的帮忙了。

  (1)UART1的时钟来源和其他串口的时钟来源不同,UART1的时钟来源是:APB2,其他串口的时钟来源:APB1。

  (2)用于UART通信的引脚不会自动配置,需要手工配置。其中用于输出信号的引脚TX必须配置成为推挽式输出,而RX引脚则配置成浮动型输入。

  (3)串口波特率、停止位等参数由库提供的stm32f10x_usart.c中的

  void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)

  函数来设定。

  观察这个函数的执行,可以看到函数通过对CR2寄存器的操作来设定停止位,如下图蓝色框中所示。

  

  通过对CR1寄存器的设定来确定数据位/奇偶校验位等,这些都只需要找到相应的符号,就能顺利地进行设置,找到符号的方法,当然还是上面的按F12浏览的方法。

  还有一个重要的工作是波特率的计算,且看这里是如何来做的。

  下面这一段是波特率设置的代码

  2.gif

  首先根据usartxbase的值来确定需要配置的是USART1还是USART2

  usartxbase = (uint32_t)USARTx;

  而USARTx是传入这个函数的一个参数。

  然后据此来得到用于USART的时钟频率,这个频率值被变量apbclock记录。

  1.gif

  从上面变量的跟踪可以看到apbclock的值是0x44aa200即72000000,也就是72MHz。

  接下来的一系列计算式就是根据波特率的值来计算应该传入BRR寄存器的值了,偷点懒,这里就不对算式进行一一分析了(我认为暂时没有这个必要)。

  至此,USART的设置工作完成,即完成了其数据位、停止位、奇偶校验位、波特率的设置工作。异步通信的配置工作完成。当然,细细分析,可以发现,初始还按默认方式处理了硬件握手等的处理工作。

  除了使用库函数提供的printf等函数外,我们在单片机开发中还经常使用直接对数据寄存器赋值的方法来使用串口。STM32串口的数据寄存器名为DR,因此,我试着在main函数中写入这样一行:

  While1()

  { USART1-》DR=0x55;

  }

  一试成功,软件仿真时,在串行窗口出现了大串的字符55.

  好了,串口暂时告一段落。

关键字:STM32  串口  PWM  定时器 引用地址:STM32单片机学习手记

上一篇:英特尔移动IC工艺技术不占优势
下一篇:一种基ARM7的无线局域网MAC片上系统架构

推荐阅读最新更新时间:2024-03-16 13:11

基于STM32的学习型通用红外遥控设备的设计实现
CPU: STM32 调试平台: STM32F103ZET和STM32F103VBT 软件平台: Keil uVision4 电路设计: Altium Designer v6.9 二、学习型红外遥控设备的各个模块实现 2.4 红外脉宽存储及FLASH的读写 根据STM32型号的不同,FLASH容量由16K到1024K不等。 FLASH模块主要由三部分组成:主存储器、信息块、闪存存储器接口寄存器。FLASH模块组织: 详细内容见《STM32中文参考手册》小节《2.3.3 嵌入式闪存》。 主存储器用来存放代码和数据常数,对于大容量产品,划分为256页,每页2K字节;中小容量产品每页则是1K。信息块的启动程序代码用来存储ST
[单片机]
基于<font color='red'>STM32</font>的学习型通用红外遥控设备的设计实现
上拉电阻与下拉电阻的定义及作用
什么是上拉电阻? 将一个不确定信号(高或低电平),通过一个电阻与电源VCC相连,固定在高电平; 什么是下拉电阻? 将一个不确定信号(高或低电平),通过一个电阻与地GND相连,固定在低电平。 图:左边的是上拉电阻示意图,右边的是下拉电阻示意图(无内容无关联) 上拉电阻与下拉电阻用在什么场合? 答:用在数字电路中,存在高低电平的场合。 上拉电阻与下拉电阻怎么接线? 答:上拉电阻:电阻一端接VCC,一端接逻辑电平接入引脚(如单片机引脚) 下拉电阻:电阻一端接GND,一端接逻辑电平接入引脚(如单片机引脚) 上拉电阻与下拉电阻的作用 1、提高输出引脚的驱动能力: 例如,当STM32的CPU引脚输出高电平,但由于后续电路的影响,输出的
[单片机]
上拉电阻与下拉电阻的定义及作用
基于PR的单相PWM整流器电流控制研究
  1.引言   单相PWM 整流器由于其所用电力电子器件少、控制系统简单而被广泛应用于电力机车 牵引 、可再生能源的并网发电 、能量可双向流动的级联型多电平变频器的有源前端 等。 PWM 整流器交流侧电流有多种控制方法,例如,电流滞环控制、线性PI 控制、预测电 流控制等。电流滞环控制结构简单、鲁棒性强,但是它有开关频率不固定,存在滞环宽度两 倍的电流误差等缺点 。   对于三相PWM 整流器,可将静止ABC 坐标系下的正弦电流转换 到同步dq 坐标系下的直流量进行PI 调节以实现零静差控制,但对于单相PWM 整流器,很难实现这种变换,PI 调节器无法实现电流的零静差控制 ,而预测电流控制的控制性能受被 控对象和给定预测
[电源管理]
基于PR的单相<font color='red'>PWM</font>整流器电流控制研究
STM32 TB6612驱动的直流有刷减速电机
电机的基本认识 这里呢,平衡小车最常用到的是直流编码有刷电机,直流的意思是使用直流电,给引脚通的是恒定电流;编码指的是电机自带编码盘,上面有两个相位正交的编码器,可以利用四倍频技术实现对电机位置和转速的精确追踪;有刷指的是电机内部自带换向器,电机转子每旋转180度,线圈中的电流即自动换向,不需要软件或者硬件驱动的控制。 这种电机通常有6个引脚:电源引脚:5V、GND,PWM输入引脚:IN1、IN2,编码器输出引脚:OUT1、OUT2。 PCB走线时要注意只有编码器引脚是信号线,可以走细一些,其他线建议走粗一些(30mil以上)。 电机驱动:TB6612 由于STM32的引脚只能提供3.3V电压,且功率输出能力很弱,因此
[单片机]
<font color='red'>STM32</font> TB6612驱动的直流有刷减速电机
贸泽率先独家备货STMicroelectronics的STM32 LoRaWAN 探索板
最新半导体和电子元件的全球授权分销商贸泽电子(Mouser Electronics) 即日起率先备货STMicroelectronics (ST)的STM32 LoRaWAN™ 探索板。这款新型探索套件与可从贸泽电子订购的Arduino兼容I-NUCLEO-LRWAN1 STM32 LoRa™扩展板一起作为一个平台,用于了解和评估基于LoRa和FSK/OOK 射频 (RF) 通信的解决方案。         贸泽电子独家备货的 ST STM32 LoRaWAN探索套件基于一体化开放式 Murata Type ABZ模块,支持低功率广域网(LPWAN) 和LoRaWAN 远程无线协议。Type ABZ模块包含一个具有192 KB 闪
[单片机]
基于VHDL语言的99小时定时器设计及实现
   0 引言   传统的定时器硬件连接比较复杂,可靠性差,而且计时时间短,难以满足需要。本设计采用可编程芯片和VHDL语言进行软硬件设计,不但可使硬件大为简化,而且稳定性也有明显提高。由于可编程芯片的频率精度可达到50 MHz,因而计时精度很高。本设计采用逐位设定预置时间,其最长时间设定可长达99小时59分59秒。完全可以满足用户的需要,使用也更为方便。    1 系统原理   本定时器的核心器件为EP1C6Q240C8芯片。该芯片有选位、置位、启动、复位、倒计时等功能,显示采用2个3位LED数码管,并采用共阴接法,可以动态扫描显示。其系统原理如图1所示。    2 硬件设计   本系统共有两大模块,分别为控制/定
[嵌入式]
基于VHDL语言的99小时<font color='red'>定时器</font>设计及实现
MSP430教程12:MSP430单片机MSP430定时器
在MSP430系列单片机中带有功能强大的定时器资源,这定时器在单片机应用系统中起到重要的作用。利用MSP430(以下称为430)单片机的定时器可以用来实现计时,延时,信号频率测量,信号触发检测,脉冲脉宽信号测量,PWM信号发生。另外通过软件编写可以用作串口的波特率发生器。后面我们将用定时器A作为一个波特率发生器,来编写一个串口例程给初学者参考。以加强初学者对定时器A的理解和应用。 在430的大系列产品中,不同的子系列产品定时器资源有所不同;在F11X,F11X1中是不带定时器B资源的。430的定时器主要分为3部分模块:看门狗定时器,定时器A,定时器B。定时器A主要资源特点有16位定时计数器,其计数模式有4种。多种计数时钟信号供
[单片机]
按键开关机电路图 按键开关机电路设计方案
最近做个基于STM32脑波检测的项目,甲方爸爸要求使用按键进行开关机。在网上查了一些资料,找到了很多案例分享,在此进行总结。 主要分为以下两部分: 单片机控制按键开关机电路 独立按键开关机电路 1、单片机控制按键开关机电路 1.1、简约版 图中Ctr和Key接单片机管脚,作用如下: Ctr作为开关控制用 Key作为按键检测用 操作流程: 开机:按下按键,Q1导通,单片机上电,控制Ctr为低电平,保持Q1导通。 关机:再按下按键,单片机控制Ctr为高电平,此时松开按键Q1截至,单片机停电。 如图: 简约版 优缺点分析: 优点:电路简单,元器件比较少。 缺点:在停机状态下单片机的IO口依旧带电,正常使用没问
[单片机]
按键开关机电路图 按键开关机电路设计方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved