Сравнение выходных данных 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);