STM32F103单片机生成16路PWM波

发布者:心灵的旅程最新更新时间:2022-01-06 来源: eefocus关键字:STM32F103  单片机  16路  PWM波 手机看文章 扫描二维码
随时随地手机看文章

单片机输出pwm波在项目中是恨常用的一个功能,今天就总结一下用STM32F103C8T6单片机输出16路 pwm波。


使用keil5软件,用标准库函数来实现。


首先看定时器初始化


void TIM1_PWM_Init(u16 arr, u16 psc)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    TIM_OCInitTypeDef TIM_OCInitSturcture;

 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1, ENABLE);

    //初始化IO口

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    //设置 TIM ARR PSC

    TIM_TimeBaseInitStructure.TIM_Period = arr;

    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;

    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式

    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;

    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);

 

    //TIM1_CH1  PWM1 模式

    TIM_OCInitSturcture.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitSturcture.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitSturcture.TIM_OCPolarity = TIM_OCPolarity_High; //输出高电平有效

    TIM_OC1Init(TIM1, &TIM_OCInitSturcture);

 

    //TIM1_CH2  PWM1 模式

    TIM_OCInitSturcture.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitSturcture.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitSturcture.TIM_OCPolarity = TIM_OCPolarity_High;  

    TIM_OC2Init(TIM1, &TIM_OCInitSturcture);

 

 

    //TIM1_CH3  PWM2 模式

    TIM_OCInitSturcture.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitSturcture.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitSturcture.TIM_OCPolarity = TIM_OCPolarity_High;  

    TIM_OC3Init(TIM1, &TIM_OCInitSturcture);

 

    //TIM1_CH4  PWM2 模式

    TIM_OCInitSturcture.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitSturcture.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitSturcture.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC4Init(TIM1, &TIM_OCInitSturcture);

 

 

    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //TIM1_CH1 使能预装载寄存器

    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //TIM1_CH2 使能预装载寄存器

    TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable); //TIM1_CH3 使能预装载寄存器

    TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //TIM1_CH4 使能预装载寄存器

 

 

    TIM_Cmd(TIM1, ENABLE); //使能计数器

    TIM_CtrlPWMOutputs(TIM1, ENABLE); //主输出使能

}

初始化定时1的4个通道,对应IO口为 PA8,PA9,PA10,PA11,将这4个口都设置为PWM输出口。入口参数arr用来设置定时器的自动重装载值,psc用于设置时钟分频系数。时钟默认为72MHZ。


下来初始化定时器2


void TIM2_PWM_Init(u16 arr, u16 psc)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    TIM_OCInitTypeDef TIM_OCInitStructure;

 

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);   //使能定时器2时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);           //使能GPIO时钟

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    //初始化TIM2

    TIM_TimeBaseInitStructure.TIM_Period = arr;

    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;

    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

 

//初始化TIM2_CH1  PWM 模式

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC1Init(TIM2, &TIM_OCInitStructure);

 

    //初始化TIM2_CH2  PWM 模式

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC2Init(TIM2, &TIM_OCInitStructure);

 

    //初始化TIM2_CH3  PWM 模式

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC3Init(TIM2, &TIM_OCInitStructure);

 

    //初始化TIM2_CH4  PWM 模式

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC4Init(TIM2, &TIM_OCInitStructure);

 

    //使能TIM2在CCR上的预装载寄存器

TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);

    TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);

    TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);

    TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);

 

    //使能TIM2

    TIM_Cmd(TIM2, ENABLE);

}

这里要注意的是,定时器1是高级定时器,定时器2、3、4是通用定时器。只有高级定时器有重复计数寄存器,而通过定时器没有重复计数寄存器。定时器2初始化时,比定时器1少一行代码,这里要注意一下。


 TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;


重复计数寄存器主要作用如下:

其余设置方法和定时器1基本一样,定时器2的4个通道对应的IO口为PA0,PA1,PA2,PA3.将这四个口设置为PWM输出模式。


入口参数arr用来设置定时器的自动重装载值,psc用于设置时钟分频系数。时钟默认为72MHZ。


下来设置定时器3


void TIM3_PWM_Init(u16 arr, u16 psc)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    TIM_OCInitTypeDef TIM_OCInitStructure;

 

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); //使能GPIO时钟

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

 

    //初始化TIM3

    TIM_TimeBaseInitStructure.TIM_Period = arr;

    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;

    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);

 

    //初始化TIM3_CH1  PWM 模式

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC1Init(TIM3, &TIM_OCInitStructure);

 

    //初始化TIM3_CH2  PWM 模式

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC2Init(TIM3, &TIM_OCInitStructure);

 

    //初始化TIM3_CH3  PWM 模式

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC3Init(TIM3, &TIM_OCInitStructure);

 

    //初始化TIM3_CH4  PWM 模式

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

    TIM_OC4Init(TIM3, &TIM_OCInitStructure);

 

    //使能TIM3在CCR上的预装载寄存器

    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);

    TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

    //使能TIM3

    TIM_Cmd(TIM3, ENABLE);

}


设置方法和定时器2一样,定时器3的4个通道对应的IO口为PA6,PA7,PB0,PB1。将这四个口设置为PWM输出模式。


入口参数arr用来设置定时器的自动重装载值,psc用于设置时钟分频系数。时钟默认为72MHZ。


最后设置定时器4


void TIM4_PWM_Init(u16 arr, u16 psc)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

    TIM_OCInitTypeDef TIM_OCInitStructure;

 

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);           //使能GPIO时钟

 

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

 

 

    //初始化TIM4

    TIM_TimeBaseInitStructure.TIM_Period = arr;

    TIM_TimeBaseInitStructure.TIM_Prescaler = psc;

    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);

 

//初始化TIM4_CH1  PWM 模式

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

[1] [2]
关键字:STM32F103  单片机  16路  PWM波 引用地址:STM32F103单片机生成16路PWM波

上一篇:STM32F103单片机输出相位可调PWM波
下一篇:STM103单片机串口输出函数printf重映射

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

基于EFM32TG840F16 MCU的室内甲醛检测仪设计
甲醛是一种重要的化工原料和有机溶剂,广泛使用于家庭装修的材料中。过量甲醛气体,将诱发疾病甚至致癌,直接危害着人们的身体健康和生命安全。本检测仪采用32 位超低功耗EFM32TG840F16 微处理器和高灵敏度甲醛传感器CH20/S-10,实现甲醛浓度的信号处理和采样,系统外接通讯接口及必要的扩展功能模块,构建智能化、多功能的检测系统。 1 系统硬件设计 甲醛检测 仪硬件主要由单片机主控系统、甲醛传感器接口、液晶显示(LCD)、功能键盘、数据存储、打印和报警输出等功能模块构成。系统硬件结构框图(见图1)。 图1: 系统功能框图 该系统采用32 位EFM32TG840F16 单片机作为主控核心,内
[单片机]
基于EFM32TG840F<font color='red'>16</font> <font color='red'>MCU</font>的室内甲醛检测仪设计
单片机与TA8435的步进电机细分控制方法
1 步进电机 步进电动机是纯粹的数字控制电动机,它将电脉冲信号转变成角位移,即给一个脉冲,步进电机就转一个角度,因此非常适合单片机控制。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,电机则转过一个步距角,同时步进电机只有周期性的误差而无累积误差,精度高。 步进电动机有如下特点: ①步进电动机的角位移与输入脉冲数严格成正比。因此,当它转一圈后,没有累计误差,具有良好的跟随性。 ②由步进电动机与驱动电路组成的开环数控系统,既简单、廉价,叉非常可靠。同时,它也可以与角度反馈环节组成高性能的闭环数控系统。 ③步进电动机的动态响应快,易于启停、正反
[单片机]
<font color='red'>单片机</font>与TA8435的步进电机细分控制方法
单片机4位数码管电子时钟
经过几天的努力,第一个51单片机电子时钟终于出炉了,通过4位数码管来显示时间,系统晶振11.0592MHZ,仿真图中用二极管代替时钟冒号闪烁,非门代替三极管,让仿真速度与真实速度达到一致,本设计用了6个按钮来对时间及闹钟时间的调节、关闭,p3.2接时间分加1按钮,p3.3接时间时加1按钮,p3.4接闹钟时间与当前时间切换按钮,按住不放显示闹钟的时间,闹钟初始化为00:00,放开按钮则显示当前时间,p3.5接闹钟加1按钮,p3.6接闹钟时加1按钮,p3.7接关闭闹钟按钮 有没有人会问 ,怎么没有减的按钮呢??? 为了不用那么多按钮,所以只设置了加1的按钮,那减的怎么办?? 程序的设计是这样的,当分加到59的时候,再加一次
[单片机]
<font color='red'>单片机</font>4位数码管电子时钟
单片机常识——结构和相关公司
概述 绝大多数现在的单片机都是基于冯·诺伊曼结构的,这种结构清楚地定义了嵌入式系统所必需的四个基本部分:一个中央处理器核心,程序存储器(只读存储器或者闪存)、数据存储器(随机存储器)、一个或者更多的定时/计时器,还有用来与外围设备以及扩展资源进行通信的输入/输出端口——所有这些都被集成在单个集成电路芯片上。 说单片机与通用型中央处理单元芯片不同,是因为前者一般很容易配合最小型的外部支持芯片制成工作计算机。这样就可以很容易的把单片机系统植入装置内部来控制装置了。近年来为了在指令和数据上使用不同的字宽,并提高处理器流水线速度,哈佛结构在微控制器(Microcontrollers)和数字信号处理器(Digital Signal
[单片机]
<font color='red'>单片机</font>常识——结构和相关公司
直流电动机的调速 用单片机产生PWM控制
上一篇文章已经讲解了直流电机的驱动,怎么使它正转,反转和停止,并详细的说了一下H桥原理。今天这里写一下怎么用单片机控制直流电机的速度。 直流调速器就是调节直流电动机速度的设备,上端和交流电源连接,下端和直流电动机连接,直流调速器将交流电转化成两路输出直流电源,一路输入给直流电机砺磁(定子),一路输入给直流电机电枢(转子),直流调速器通过控制电枢直流电压来调节直流电动机转速。同时直流电动机给调速器一个反馈电流,调速器根据反馈电流来判断直流电机的转速情况,必要时修正电枢电压输出,以此来再次调节电机的转速。 直流电机的调速方案一般有下列3种方式: 1、改变电枢电压; 2、改变激磁绕组电压; 3、改变电枢回路电阻。
[单片机]
89C51单片机+X25045构成的看门狗电路
采用89C51单片机和X25045组成的 看门狗电路 ,X25045硬件连接图如图1所示。X25045芯片内包含有一个看门狗定时器,可通过软件预置系统的监控时间。在看门狗定时器预置的时间内若没有总线活动,则X25045将从RESET输出一个高电平信号,经过微分电路C2、R3输出一个正脉冲,使CPU复位。图1电路中,CPU的复位信号共有3个:上电复位(C1、R2),人工复位(S、R1、R2)和Watchdog复位(C2、R3),通过或门综合后加到RESET端。C2、R3的时间常数不必太大,有数百微秒即可,因为这时CPU的振荡器已经在工作。   
[电源管理]
89C51<font color='red'>单片机</font>+X25045构成的看门狗电路
单片机温度测控系统+精度为0.1℃+4位共阳数码管显示
要求基本上是实现的。 温度测控显示系统 设计功能要求: (1) DS18B20为温度传感器,实时采样温度;温度测量精度:±0.1℃。 (2) 4位LED数码管主要用于显示温度。 (3) 无任何键按下,4位LED数码管显示时分,初值显示09:09。 (4)按键K1按下,数码管显示本机测量的温度值。 希望可以得到采纳! 单片机源程序如下: 单片机源程序如下: #include reg51.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar code tab ={0xc0,0xf9,0xa4,0xb0,0x99,
[单片机]
<font color='red'>单片机</font>温度测控系统+精度为0.1℃+4位共阳数码管显示
美新半导体发布全球第一款单片集成三轴加速度计
无锡2014年8月15日电 /美通社/ -- 美新半导体,全球领先的 MEMS 传感器和传感系统解决方案供应商,今天宣布推出 MXC400xXC,全球第一款单片集成信号处理和 MEMS 传感器的三轴 (3D) 加速度计,也是全球第一款采用圆片级封装工艺的3D加速度计。3D集成传感器和圆片级封装的整合代表了当今业界最先进的技术, 降低了近60%的成本,缩小了50%的传感器面积 ,引领全新的移动和消费类器件应用,包括移动电话、平板电脑、玩具和可穿戴设备。 这款全新 3D 加速度计的技术突破来自于美新全球独有的专利产品:热式加速度计。该 MEMS 传感器结构直接刻蚀在标准 CMOS 圆片里,是全球唯一的标准 CMOS 单片集成
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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