STM32F103C8T6用PWM实现呼吸灯

前置知识

流程图

计算公式

根据需求联立解出ARR,PSC,CCR的取值

主要用到的库函数

TIM_OCStructInit();//配置结构体TIM_OCInitStruct,初始化结构体所有成员变量
TIM_OC1Init()//初始化OC1通道,通道的位置看引脚图
TIM_SetCompare1()//设置CCR

主要代码

main.c

unsigned char i;
int main(void)
{
	PWM_Init();
	while (1)
	{
		for(i=0;i<=100;i++)
	    {
		PWM_TIM_SetCompare1(i);
		Delay_ms(10);
	    }
	    for(i=0;i<=100;i++)
	    {
		PWM_TIM_SetCompare1(100-i);
		Delay_ms(10);
	    }
	}

}

PWM.C

void PWM_Init()
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);//开启OC1引脚的时钟

	TIM_InternalClockConfig(TIM2);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1;
	TIM_TimeBaseInitStruct.TIM_CounterMode= TIM_CounterMode_Up  ;
	TIM_TimeBaseInitStruct.TIM_Period =100-1;//ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler=720-1 ;//PSC
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0 ;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	
	TIM_OCInitTypeDef TIM_OCInitStruct;
	TIM_OCStructInit(&TIM_OCInitStruct);
      TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OCInitStruct.TIM_OCMode= TIM_OCMode_PWM1;
	TIM_OCInitStruct.TIM_OCPolarity= TIM_OCPolarity_High;
	TIM_OCInitStruct.TIM_Pulse= 50;//CCR的值
	TIM_OC1Init(TIM2, &TIM_OCInitStruct);
	
	
	//配置OC1引脚
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//必须是复用推挽输出,原因见下方补充
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_TIM_SetCompare1(uint16_t Compare1)
{
	TIM_SetCompare1(TIM2,Compare1);
}

补充事项

(1)为什么选择复用推挽输出

一般情况下引脚的输出取决于单片机的输出数据寄存器,使用复用推挽输出模式,使输出控制与输出数据寄存器的通道断开,输出完全取决于外设(这里是定时器)

(2)引脚配置表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值