目标:利用TIM3结合普通GPIO实现一个1--100HZ的可控频率,误差在0.5HZ以内

   核心:要实现该功能首先要明确频率的定义,频率就是1秒内发生周期性变化的次数,例如一个正弦波,1S内,走了15个周期,那频率就是15Hz

1.在这里我是使用STM32CuBeMx建立的工程,工程建立过程就不细说了,这里主要讲解实现部分。

 我使用的是STM32F07系列外部晶振为8MHz,CuBeMx建立的工程有一个好处就是可以减少很多初始化的步骤,加快开发速度。

2.先对定时器进行初始化,定时一个50us的定时器,我这里定时器初始频率为48MHz

htim3.Init.Prescaler =50-1;//定时0.05ms=50us  ,预分频

htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

htim3.Init.Period = 47;//设定计数值

 最终定时器频率计算为: 48MHz/(GENERAL_TIMx_PRESCALER+1)/GENERAL_TIMx_PERIOD

3.这里的频率控制参数0-100主要由上位机通过串口传输,关于上位机与串口的知识这里不细讲,

因为上位机把数据字符串拆分成一个个的十六进制发送下来,这里只放接收到数据后的处理方法;

case 0x10 :   //上位机接收数据处理,0x01数据头   

if(Uart1_Rxbuf.Data[1] == 0x30) //对0进行处理   

{    

  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET); //ltc1624使能      

  time_flag1=0; tim_no=0;   

}   

else   

{   if(Uart1_Rxbuf.Data[2] == 0x0a)

  {

    fre= (uint32_t )Uart1_Rxbuf.Data[1]-0x30; //接收个位数数据处理     

    else if (Uart1_Rxbuf.Data[3] == 0x0a)

      fre= ((Uart1_Rxbuf.Data[1]-0x30)*10) + (Uart1_Rxbuf.Data[2]-0x30); //接收十位数数据处理     

    else if (Uart1_Rxbuf.Data[4] == 0x0a)   //接收百位数数据处理

      fre= ((Uart1_Rxbuf.Data[1]-0x30)*100) + ((Uart1_Rxbuf.Data[2]-0x30)*10) + (Uart1_Rxbuf.Data[2]-0x30);     

    else if (Uart1_Rxbuf.Data[5] == 0x0a)

      fre= 1000; //1000Hz     

    fr=10000/fre; //上位机控制参数跟定时器定时计数的关系     

    fre_control1=(int)( fr+0.5) > (int) fr ? (int)fr+1:(int)fr; //四舍五进     

    time_flag1=1;     

    i1=0;     

    tim_no=1; //打开频率控制标志   

}

break ;

4.核心:利用中断回调函数,通过中断计数,根据计数值跟控制参数的计数关系实现调频,

  核心是利用计算定时时间次数,控制方波输出时间的长短,达到调频目的。

if(tim_no ==1)   

{

  if( time_flag1 == 1 ) //通道1调频

  {

    i1++;

  if( i1==fre_control1 )

  {

    i1=0;

    HAL_GPIO_TogglePin (GPIOC ,GPIO_PIN_0 );

    }

}

}

这里可以利用标志位实现多通道调频,我用逻辑分析仪实测6个通道同时调频1-100HZ误差不超过0.5HZ。

STM32利用TIM3产生一个1--100Hz可调频率的更多相关文章

  1. STM32 一个定时器产生4路 独立调频率,占中比可调,脉冲个数可以统计。

    实现这个功能,基本原理是利用STM32 的输出比较功能. 1.其它设置就是普通定时器的设置这里开启,四个输出比较中断,和一个更新中断, 更新中断这里不需要开也可以达到目的,我这里开启是做其它的用处的. ...

  2. 转载 STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发

    STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发  本文转载自 https://www.cnblogs.com/xingboy/p/9913963.html 这里我主要说一 ...

  3. 利用ANTLR4实现一个简单的四则运算计算器

    利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...

  4. 学了C语言,如何利用cURL写一个程序验证某个网址的有效性?

    在<C程序设计伴侣>以及这几篇关于cURL的文章中,我们介绍了如何利用cURL写一个下载程序,从网络下载文件.可是当我们在用这个程序下载文件时,又遇到了新问题:如果这个网址是无效的,那么我 ...

  5. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装

    在这一系列的前一篇文章学了C语言,如何为下载狂人写一个磁盘剩余容量监控程序?中,我们为下载狂人写了一个程序来监视磁盘的剩余容量,防止下载的东西撑爆了硬盘.可是,这两天,他又抱怨他的下载程序不好用,让我 ...

  6. 利用Matlab生成一个网格化的三维球面(生成直角坐标)

    利用Matlab生成一个网格化的三维球面,分别对径向方向.经度方向和纬度方向进行网格化,代码如下: %生成一个笛卡尔坐标系下球面网格的x,y,z坐标 %r为球面距离 %nJingdu,nWeidu分别 ...

  7. 利用Python实现一个感知机学习算法

    本文主要参考英文教材Python Machine Learning第二章.pdf文档下载链接: https://pan.baidu.com/s/1nuS07Qp 密码: gcb9. 本文主要内容包括利 ...

  8. 利用 vue-cli 构建一个 Vue 项目

    一.项目初始构建 现在如果要构建一个 Vue 的项目,最方便的方式,莫过于使用官方的 vue-cli . 首先,咱们先来全局安装 vue-cli ,打开命令行工具,输入以下命令: $ npm inst ...

  9. python基础一 ------利用生成器生成一个可迭代对象

    #利用生成器生成一个可迭代对象#需求:生成可迭代对象,输出指定范围内的素数,利用生成器产生一个可迭代对象#生成器:本身是可迭代的,只是 yield 好比return返回,yield返回后函数冻结状态, ...

随机推荐

  1. Java基础学习总结(35)——Java正则表达式详解

    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu  ...

  2. ZOJ 2316 Matrix Multiplication

    Matrix Multiplication Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on ZJU. O ...

  3. Python Study (06)内存管理GC

    对象在内存的存储,我们可以求助于Python的内置函数id().它用于返回对象的身份(identity).其实,这里所谓的身份,就是该对象的内存地址. a = 1 print(id(a)) #1124 ...

  4. 对thinkpad太失望了

    本来本着对thinkpad的信任买的,结果买回来一直吱吱吱吱响个不停. 好像是磁盘的问题,太垃圾了. http://benyouhui.it168.com/thread-1111376-1-1.htm ...

  5. spring cloud 中Actuator不显示更多信息的处理方式

    spring cloud 中Actuator不显示更多信息的处理方式 直接咨询了周大立,他说 management.security.enabled = false 就可以了: 学习了:http:// ...

  6. Leetcode_299_Bulls and Cows

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/50768550 You are playing the fo ...

  7. 低调、奢华、有内涵的敏捷式大数据方案:Flume+Cassandra+Presto+SpagoBI

    基于FacebookPresto+Cassandra的敏捷式大数据 文件夹 1 1.1 1.1.1 1.1.2 1.2 1.2.1 1.2.2 2 2.1 2.2 2.3 2.4 2.5 2.6 3 ...

  8. 在eclipse中关联android源代码

    1打包源代码成jar: 1 新建一个java项目 2  import  想打包的源代码文件 3 export 这个文件 : 选择java->jar file .  这里会让你选择输出路径 2 加 ...

  9. Redis命令-HyperLogLog

    HyperLogLog数据结构简单介绍 能够看http://www.cnblogs.com/ysuzhaixuefei/p/4052110.html  博客,介绍的相对照较清晰. HyperLogLo ...

  10. 利用JDBC或者事物或者调用存储过程实现往MySQL插入百万级数据

    转自:http://www.cnblogs.com/fnz0/p/5713102.html 想往某个表中插入几百万条数据做下测试, 原先的想法,直接写个循环10W次随便插入点数据试试吧,好吧,我真的很 ...