1、接线图展示
注:图片来自于江科大,本日志只需要A0--A3接口处的LED即可。
2、原理说明
利用改变占空比的方式来实现LED呼吸灯的效果,通过依次实现呼吸灯来实现流水灯的效果
3、代码实现
PWM.h
#ifndef __PWM_H
#define __PWM_H
void PWM_Init(void);
void PWM_SetCompare1(uint16_t compare);
void PWM_SetCompare2(uint16_t compare);
void PWM_SetCompare3(uint16_t compare);
void PWM_SetCompare4(uint16_t compare);
#endif
PWM.c
#include "stm32f10x.h" // Device header
void PWM_Init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化为复用输出模式
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_Period=100-1; //ARR设置为100,方便计算占空比
TIM_TimeBaseInitStructure.TIM_Prescaler=720-1; //PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; //高级定时器才有
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=1; //CCR
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
TIM_OCInitTypeDef TIM_OC2InitStructure;
TIM_OCStructInit(&TIM_OC2InitStructure);
TIM_OC2InitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OC2InitStructure.TIM_OCPolarity=TIM_OCNPolarity_High;
TIM_OC2InitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC2InitStructure.TIM_Pulse=1;
TIM_OC2Init(TIM2,&TIM_OC2InitStructure);
TIM_OCInitTypeDef TIM_OC3InitStructure;
TIM_OCStructInit(&TIM_OC3InitStructure);
TIM_OC3InitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OC3InitStructure.TIM_OCPolarity=TIM_OCNPolarity_High;
TIM_OC3InitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC3InitStructure.TIM_Pulse=1;
TIM_OC3Init(TIM2,&TIM_OC3InitStructure);
TIM_OCInitTypeDef TIM_OC4InitStructure;
TIM_OCStructInit(&TIM_OC4InitStructure);
TIM_OC4InitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OC4InitStructure.TIM_OCPolarity=TIM_OCNPolarity_High;
TIM_OC4InitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OC4InitStructure.TIM_Pulse=1;
TIM_OC4Init(TIM2,&TIM_OC4InitStructure); //初始化四个通道
TIM_Cmd(TIM2,ENABLE);
}
void PWM_SetCompare1(uint16_t compare)
{
TIM_SetCompare1(TIM2,compare);
}
void PWM_SetCompare2(uint16_t compare)
{
TIM_SetCompare2(TIM2,compare);
}
void PWM_SetCompare3(uint16_t compare)
{
TIM_SetCompare3(TIM2,compare);
}
void PWM_SetCompare4(uint16_t compare)
{
TIM_SetCompare4(TIM2,compare);
}
main.c
#include "stm32f10x.h" // Device header
#include "PWM.h"
#include "Delay.h"
uint16_t i=0;
int main(void)
{
PWM_Init();
while(1)
{
for(i=0;i<=100;i++)
{
PWM_SetCompare1(100-i);
Delay_ms(10);
}
for(i=0;i<=100;i++)
{
PWM_SetCompare1(i);
Delay_ms(10);
}
//由于采取的是低电平点亮的方式,所以占空比越小,LED越亮
for(i=0;i<=100;i++)
{
PWM_SetCompare2(100-i);
Delay_ms(10);
}
for(i=0;i<=100;i++)
{
PWM_SetCompare2(i);
Delay_ms(10);
}
for(i=0;i<=100;i++)
{
PWM_SetCompare3(100-i);
Delay_ms(10);
}
for(i=0;i<=100;i++)
{
PWM_SetCompare3(i);
Delay_ms(10);
}
for(i=0;i<=100;i++)
{
PWM_SetCompare4(100-i);
Delay_ms(10);
}
for(i=0;i<=100;i++)
{
PWM_SetCompare4(i);
Delay_ms(10);
}
}
}
以上就是日志三全部内容。
如有问题,欢迎在评论区讨论,后续将继续更新其他模块的代码。໒( = ᴥ =)ʋ