基于STM32利用TIM3的通道输出四个不同的PWM波

发布者:cannon928最新更新时间:2019-08-22 来源: eefocus关键字:STM32  TIM3  通道输出  PWM波 手机看文章 扫描二维码
随时随地手机看文章

2019年7月25日

做小车的第五天。

今天我实现了一个新的功能:利用一个定时器的个各通道输出4路PWM波(可用来控制2个直流电机)

大致思路是:通过改变每个每个通道PWM波的占空比,达到输出4路不同的PWM波,可利用差值实现差速,从而控制电机的运转。

代码如下:

/********************.h文件/

#ifndef __TIM3_H

#define __TIM3_H

#include “stm32f10x.h”

#include “sys.h”

void TIM3_PWM_Init(u16 arr,u16 psc); //声明函数

#endif

/.c文件/

/

在.c文件里主要是配置TIM3的4个通道对用的IO口、初始化定时器,初始化输出比较参数

/

#include “timer.h”

#include “usart.h”

void TIM3_PWM_Init(u16 arr,u16 psc)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

TIM_OCInitTypeDef TIM_OCInitStruct;

/使能TIM3时钟以及对应的GPIO时钟/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

/

4个通道分别对应PA6 PA7 PB0 PB1/

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //设置为复用推挽输出

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);


GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOB,&GPIO_InitStructure);

/此段是初始化定时器*****/

TIM_TimeBaseInitStructure.TIM_Period=arr;

TIM_TimeBaseInitStructure.TIM_Prescaler=psc;

TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);

/*************************************************************

4个通道均采用PWM2模式,极性为高(因为形式都一样就不全写了)

其他的三个通道只需要把

TIM_OC1Init(TIM3,&TIM_OCInitStruct);

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);

中的1改为对应的通道。

*****/

TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM2;

TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;

TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;

TIM_OC1Init(TIM3,&TIM_OCInitStruct);

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_Cmd(TIM3,ENABLE);

}

/.c/

#include “timer.h”

#include “delay.h”

#include “usart.h”

int main(void)

{

delay_init();

TIM3_PWM_Init(9999,7199); //由公式可以算的周期为1s (每次从0计数到9999)

while(1)

{


TIM_SetCompare1(TIM3,2000); //80%占空比

TIM_SetCompare2(TIM3,4000); //60%占空比

TIM_SetCompare3(TIM3,6000); //40%占空比

TIM_SetCompare4(TIM3,8000); //20%占空比

delay_ms(500);

}

下面附PWM图片


在这里插入图片描述

关键字:STM32  TIM3  通道输出  PWM波 引用地址:基于STM32利用TIM3的通道输出四个不同的PWM波

上一篇:STM32 PWM之实现呼吸灯
下一篇:STM32 串口通信简单测试

推荐阅读最新更新时间:2024-11-05 10:19

stm32之NVIC
STM32的NVIC理解 (绿色和紫色分别为其他优秀网友成果,真诚的感谢。现拷贝过来汇总方便大家学习,如若构成侵权请及时联系) 例程: /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* Enable the WAKEUP_BUTTON_EXTI_IRQn Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = WAKEUP_BUTTON_EXTI_IRQn; NVIC_InitStructure.NVIC_IRQCh
[单片机]
<font color='red'>stm32</font>之NVIC
stm32调试遇到问题及解决
一、PB4始终是高电平,导致超声波传感器用不起来。 百度了一下,stm32有些管脚上电默认的功能不是通用的GPIO,比如JTAG与SWD调试管脚,所以如果想要使用这几个管脚作为通用IO口的话就必须将JTAG与SWD功能关闭,并且要开启AFIO时钟。即外设的复用IO。 加上这两句:RCC_APB2PeriphClockCmd(RCC_APBPeriph_AFIO,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE); 二、多通道AD转换时有一个引脚的电压没接外部电流时都是一点几伏 由于AD转换需要设置引脚为模拟输入,模拟输入的引脚电压不固定空引脚大概为1/2V
[单片机]
STM32时钟系统学习
时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32。 下面是从网上找的一个STM32时钟框图,比《STM32中文参考手册》里面的是中途看起来清晰一些: 重要的时钟: PLLCLK,SYSCLK,HCKL,PCLK1,PCLK2 之间的关系要弄清楚; 1、HSI:高速内部时钟信号 stm32单片机内带的时钟 (8M频率) 精度较差 2、HSE:高速外部时钟信号 精度高 来源(1)HSE外部晶体/陶瓷谐振器(晶振) (2)HSE用户外部时钟 3、LSE:低速外部晶体 32.768kHz 主要提供一个精确的时钟源 一般作为RTC时
[单片机]
<font color='red'>STM32</font>时钟系统学习
STM32单片机-ID操作
每一片 STM32 芯片内部拥有一个独一无二的 Unique Device ID, 96 Bit. 这个 ID 号可以提供给开发者很多优越的功能, 例如: 1. 可以把 ID 做为用户最终产品的序列号,帮助用户进行产品的管理。 2. 在某些需要保证安全性的功能代码运行前,通过校验此 ID,保证最终产品的某些功能的安全性。 3. 用 ID 配合加解密算法,对芯片内部的代码进行加加密,以保证用户产品的安全性和不可复制性。 这项功能相信对那些不希望自己的产品不被别人抄袭来说肯定是个非常不错的。 下面我就先大家介绍如何读出这个 ID: 这个 ID 号是放在片内 Flash 中的固定的位置,直接读取出来就行了. 96 位的独特 ID 位
[单片机]
<font color='red'>STM32</font>单片机-ID操作
STM32的独立看门狗
STM32 内 部自带了 2 个看门狗:独立看门狗(IWDG)和窗口看门狗(WWDG) STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然 有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的 40Khz,而是 在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看 门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。 首先我们得讲解一下看门狗的原理。这个百度百科里面有很详细的解释。我们总结一下: 单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免 这种情况的发生。看门狗的作用
[单片机]
STM32基于固件库学习笔记(1)GPIO基本使用
GPIO初始化函数: void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); /* 第一个参数是用来指定 GPIO,取值范围为 GPIOA~GPIOG 第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef */ GPIO_InitTypeDef结构体 typedef struct { uint16_t GPIO_Pin;//配置端口管脚 GPIOSpeed_TypeDef GPIO_Speed;// IO 口速度设置 输出速度(只有输出模式才配置速度) GPIOMode_TypeDef GPIO_Mode;// IO
[单片机]
STM32芯片超低功耗设计思路
对于给定的制造工艺和晶片区域,微控制器的功耗主要取决于两个因素(动态可控):电压和频率。 ST公司L系列超低功耗芯片为130nm超低泄漏工艺,在超低功耗所做的设计思路如下: 1、围绕Cortex-M3内核构建,具有领先的处理性能和代码密度,其处理性能使得运行模式时间更少,因此可以使深度睡眠模式的时间更长。 2、提供3个动态可选电压范围,从1.8V到1.2V,可在能耗上提供超过25%的增益。 3、提供7种低功耗模式,逐步禁用与频率无关的电流源(时钟源、非易失性存储器、调压器),直至大部分外设掉电。 4、灵活的门控技术,超低功耗模式下只激活必要的逻辑门。a)闲置的引脚配置为模拟输入;b)连接外围电路的引脚,提供有效的Pull
[单片机]
stm32串口接收数据程序
void init_usart(void) //RCC初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,,ENABLE);//使能GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //nvic NVIC_ InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM NVIC_SetVectorTable(NVIC_VectTab_RAM,Ox0);#else NVIC_SetVectorTable(NVIC_VectTab_FL
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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