Сравнение TIM-выходов (PWM) - STM32

Сравнение выходных данных TIM — STM32

Oc (Output Compare) Сравнение выходных данных Функция
сравнения выходных сигналов может установить выходной уровень на 1, установить на 0 или изменить операцию путем сравнения соотношения между значениями регистров CNT и CCR, которое используется для вывода сигналов ШИМ с определенной частотой и рабочим циклом.
, И расширенный таймер, и таймер общего назначения имеют 4 выходных канала сравнения. Первые 3 канала расширенного таймера дополнительно имеют функцию формирования мертвой зоны и дополнительный выход.

вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения

вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
Шаг 1: RCC включает часы и включает часы периферийных устройств TIM и периферийных устройств GPIO, которые мы хотим использовать
Шаг 2: Настройте базовую единицу времени, включая предыдущий выбор источника часов
Шаг 3: Настройте блок сравнения выходов, который включает в себя значение этого CCR, режим сравнения выходов, выбор полярности, выход, разрешающий эти параметры.
Четвертый шаг — настроить GPIO и инициализировать порт GPIO, соответствующий PWM, для конфигурации мультиплексированного двухтактного выхода.
Пятый шаг – запустить контроль. Запустите счетчик, чтобы можно было вывести ШИМ.
вставьте сюда описание изображения

вставьте сюда описание изображения
вставьте сюда описание изображения
Предустановленная функция — это теневой регистр (аналог буферного регистра).Та,
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
что с N, — это конфигурация дополнительного канала в расширенном таймере
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
. Если вы не хотите перечислять все члены и присваивать значения, вы можете сначала назначьте начальное значение с помощью Stiuctlnit, а затем измените значение. Значение, которое вы хотите изменить, в порядке,
вставьте сюда описание изображения
только установите GPIO на мультиплексный двухтактный выход.
вставьте сюда описание изображения

вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения

#include "stm32f10x.h"                  // Device header

void PWM_Inint(void)
{
	//第一步开启时钟,初始化RCC,选择TIM2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	//设置输出PWM的GPIO端口
		//使能GPIOA的时钟 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	//GPIOA模式初始化
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	//第二步选择时基单元的时钟,选择内部时钟,选择TIM2
	TIM_InternalClockConfig(TIM2);
	
	//第三步配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数 1分频
	TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数的模式 向上计数
	//频率为1KHz,占空比为50%的PWM波形
	//计数器溢出频率:CK CNT_OV = CKCNT /(ARR + 1)= CK PSC /(PSC + 1)/(ARR +1)
	//配置定时为1s,则CK CNT_OV=1;CKCNT=72MHz=72000000;
	TIM_TimeBaseInitStruct.TIM_Period = 100 - 1;//周期,ARR自动重装器的值 范围0~65536
	TIM_TimeBaseInitStruct.TIM_Prescaler = 720 - 1;//PSC预分频器的值 范围0~65536
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值 高级计数器才有
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
	
	//第四步配置输出中断
	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//更新中断
	
	//清除中断标志位,能够避免刚初始化完就进中断的问题
	TIM_ClearFlag(TIM2,TIM_IT_Update);
	
	//第五步,配置输出比较单元,里面包括这个CCR的值、输出比较模式、极性选择、输出使能这些参数。
	TIM_OCInitTypeDef TIM_OCInitStruct;
	//先对结构体中的全部成员赋予初始值
	TIM_OCStructInit(&TIM_OCInitStruct);
	//在修改需要用到成员的值
	TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//设置输出比较的模式
	TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;//设置输出比较的极性
	TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//设置输出比较的使能
	TIM_OCInitStruct.TIM_Pulse = 0;//50;//用来设置CCR 
	TIM_OC1Init(TIM2,&TIM_OCInitStruct);

	//第六步,运行控制
	TIM_Cmd(TIM2,ENABLE);
}

//让LED呈现呼吸灯的效果,那就是不断更改CCR的值就行了
void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2,Compare);

}

#ifndef _PWM_H
#define _PWM_H

void PWM_Inint(void);
void PWM_SetCompare1(uint16_t Compare);

#endif

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "KEY.h"
#include "PWM.h"

uint8_t i;//定义一个全局变量

int main(void)
{

	
	while(1)
	{
			for(i=0;i<100;i++)
			{
				PWM_SetCompare1(i);
				Delay_ms(10);
			}
			
			for(i=0;i<100;i++)
			{
				PWM_SetCompare1(100-i);
				Delay_ms(10);
			}
	}
}

переназначение контактов

вставьте сюда описание изображения
Необходимо использовать AFIO.
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
вставьте сюда описание изображения
Если вы хотите использовать три контакта PA15, PB3 и PB4 в качестве GPIO;
вставьте сюда описание изображения
если вы хотите переназначить мультиплексированные контакты таймеров или других периферийных устройств
вставьте сюда описание изображения

	//第一步开启时钟,初始化RCC,选择TIM2
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
		//实现重映射,将TIM2_CH2通道重映射到PA15
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO时钟
	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);
	//关闭PA15端口的复用
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	
	//设置输出PWM的GPIO端口
		//使能GPIOA的时钟 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);	
	//GPIOA模式初始化
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;//GPIO_Pin_0;//将PA0改到PA15了
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

Supongo que te gusta

Origin blog.csdn.net/qq_45159887/article/details/130464168
Recomendado
Clasificación