摘要
本篇博客将介绍如何利用STM32F103C8T6微控制器的定时器模块,实现输出四路PWM波的控制。PWM(脉冲宽度调制)是一种常用的数字信号调制技术,可用于控制电机速度、LED亮度等应用。通过本文的指导,读者可以学习如何配置STM32的定时器模块,设置PWM波的频率和占空比,从而实现多路PWM信号的输出。
引言
STM32F103C8T6是意法半导体推出的一款基于ARM Cortex-M3内核的低成本微控制器,具有丰富的外设资源,包括多个定时器模块,适合用于各种嵌入式应用。本文将以该型号的定时器模块为基础,演示如何配置和控制四路PWM信号的输出。
硬件准备
- STM32F103C8T6开发板
- USB转串口模块
- 4个LED灯
- 杜邦线
软件准备
- STM32CubeMX
- Keil MDK-ARM开发环境
步骤
1. 初始化工程
使用STM32CubeMX创建一个新工程,并选择对应的芯片型号(STM32F103C8T6)。在配置时钟、引脚等基本设置后,进入定时器配置界面。
2. 配置定时器
- 选择一个可用的定时器(比如TIM1)。
- 配置定时器的基本参数,如时钟源、计数频率等。
- 设置定时器的工作模式为PWM Generation Mode。
- 配置定时器的周期和占空比,以生成所需的PWM信号。
3. 配置输出通道
- 选择定时器的输出通道(比如CH1、CH2、CH3、CH4)。
- 配置通道的工作模式为PWM Mode 1。
- 设置通道的占空比,以控制输出PWM信号的占空比。
4. 编写代码
PWM的C文件,这里void PWM_SetCompare(uint16_t Compare1,uint16_t Compare2,uint16_t Compare3,uint16_t Compare4),,控制的是占空比,但并不是只控制它就行了
这里可以看到我们只是控制变量保证 PSC ARR固定有了频率就能算出周期,例如
我们想定时20ms
CK_PSC=72MHz(不分频)=72000 000Hz PSC=72-1 ARR=20000-1
那么频率就是50Hz周期就是20ms
本文是定时 1S
#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
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_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);
TIM_InternalClockConfig(TIM3);//连接内部时钟 打通第一个通道
TIM_TimeBaseInitTypeDef Timebasestructer;
Timebasestructer.TIM_ClockDivision=TIM_CKD_DIV1 ; // 时钟为72MHz 选择1 为部分频 即72 000 000 Hz
Timebasestructer.TIM_CounterMode=TIM_CounterMode_Up; // 计数模式 为向上计数 即从0开始
Timebasestructer.TIM_Period=10000 -1; // ARR 自动重装值 当计数到达时 就触发中断
Timebasestructer.TIM_Prescaler=7200 -1; // PSC 预分频 将72MHz 频率设置为10k Hz
Timebasestructer.TIM_RepetitionCounter=0;
//该时基单元 一秒 发生一次中断
TIM_TimeBaseInit(TIM3, &Timebasestructer);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);//配置默认项
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; //CCR
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC3Init(TIM3, &TIM_OCInitStructure);
TIM_OC4Init(TIM3, &TIM_OCInitStructure);//开启四个PWM通道
TIM_Cmd(TIM3, ENABLE); //打开TIIM3
}
void PWM_SetCompare(uint16_t Compare1,uint16_t Compare2,uint16_t Compare3,uint16_t Compare4)
{
TIM_SetCompare1(TIM3, Compare1);
TIM_SetCompare2(TIM3, Compare2);
TIM_SetCompare3(TIM3, Compare3);
TIM_SetCompare4(TIM3, Compare4);
}
main函数
这里我们江占空比从0到100再从100到0
uint16_t i=0;
uint16_t j=0;
uint16_t k=0;
uint16_t w=0;
int main(void)
{
PWM_Init();
while (1)
{
for (i = 0,j=0,k=0,w=0; i <= 100; k++,j++,i++,w++)
{
PWM_SetCompare(i,j,k,w);
Delay_ms(10);
}
for (i = 0,j=0,k=0,w=0; i <= 100; k++,j++,i++,w++)
{
PWM_SetCompare((100 - i),(100-j),(100-k),(100-w));
Delay_ms(10);
}
}
}
在Keil MDK-ARM开发环境中编写C代码,包括初始化定时器、配置输出通道、设置PWM参数等操作。通过代码控制定时器的启动和停止,以及PWM信号的输出。
5. 测试验证
将LED灯连接到对应的PWM输出引脚上,通过调节占空比和频率参数,验证PWM信号的输出效果。可以通过示波器或者逻辑分析仪来观察PWM波形。
结论
通过本文的介绍,读者可以了解如何使用STM32F103C8T6的定时器模块输出四路PWM信号。掌握PWM波的生成方法对于控制各种电路和设备具有重要意义,在实际应用中可以根据需求灵活调整PWM波的参数,实现精确的控制效果。
希望本文能够帮助读者更深入地了解STM32的定时器模块,并在嵌入式系统设计中发挥更大的作用。感谢您的阅读!
通过以上框架,您可以继续详细展开每个步骤的具体操作方法、代码实现和测试验证过程,使读者能够清晰地理解如何在STM32F103C8T6上实现输出四路PWM波。