要求: 1、甲单片机实现输出一个矩形波信号,要求频率(周期)、脉宽(占空比)可调。 2、用乙单片机来测试甲单片机实现输出的矩形波信号的周期(频率)、脉宽(占空比)。 目的:熟悉单片机的TIM的输出比较功能和输入捕捉功能,并学会TIM的程序编写。
时间: 2023-06-27 22:06:26 浏览: 132
PWM.rar_4 3 2 1_PWM 串口_stc11F04E_stc11f04e pwm_stc模拟pwm
甲单片机实现输出一个矩形波信号,要求频率(周期)、脉宽(占空比)可调。
首先,我们需要选择一个定时器来实现矩形波信号的输出。这里我们选择STM32F103C8T6开发板自带的TIM2定时器。
然后,我们需要根据要求可调的频率(周期)和脉宽(占空比)来设置TIM2的参数。具体设置如下:
1. 设置TIM2的时钟源为内部时钟,并且设置预分频系数为72,这样TIM2的时钟频率就为72MHz/72=1MHz。
2. 根据要求可调的频率(周期)来设置TIM2的自动重载寄存器ARR的值。假设要求的频率为f,那么ARR的值可以计算为ARR = 1000000 / f - 1。
3. 根据要求可调的脉宽(占空比)来设置TIM2的占空比。假设要求的占空比为d,那么TIM2的CCR1的值可以计算为CCR1 = ARR * d / 100。
4. 设置TIM2的工作模式为PWM模式1,并且使能TIM2的输出比较功能和通道1的输出。
5. 最后,启动TIM2定时器。
下面是甲单片机的代码示例:
```
#include "stm32f10x.h"
void TIM2_PWM_Init(u16 arr, u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_TIM1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler = psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_Cmd(TIM2, ENABLE);
}
int main(void)
{
TIM2_PWM_Init(999, 71); // 设置ARR为999,预分频系数为71,即定时器时钟频率为1MHz
TIM_SetCompare1(TIM2, 500); // 设置CCR1为500,即脉宽占50%
while (1);
}
```
用乙单片机来测试甲单片机实现输出的矩形波信号的周期(频率)、脉宽(占空比)。
为了测试甲单片机实现的矩形波信号的周期和脉宽,我们可以使用另外一个单片机来接收该信号并测量其周期和脉宽。具体步骤如下:
1. 将甲单片机的矩形波信号输出引脚连接到乙单片机的输入捕捉引脚。
2. 在乙单片机中设置输入捕捉模式,并且使能输入捕捉中断。
3. 在输入捕捉中断服务函数中,测量甲单片机输出的矩形波信号的周期和脉宽,并将结果保存下来。
下面是乙单片机的代码示例:
```
#include "stm32f10x.h"
volatile u16 ICValue1 = 0, ICValue2 = 0;
volatile u32 CaptureValue = 0;
void TIM3_IC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM3, &TIM_ICInitStructure);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)
{
if (ICValue1 == 0)
{
ICValue1 = TIM_GetCapture2(TIM3);
}
else
{
ICValue2 = TIM_GetCapture2(TIM3);
if (ICValue2 > ICValue1)
{
CaptureValue = ICValue2 - ICValue1;
}
else
{
CaptureValue = 0xFFFF - ICValue1 + ICValue2;
}
ICValue1 = 0;
ICValue2 = 0;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);
}
}
int main(void)
{
TIM3_IC_Init();
while (1);
}
```
在上述代码中,我们使用了TIM3定时器的输入捕捉功能来测量甲单片机输出的矩形波信号的周期和脉宽。当TIM3捕捉到引脚上的信号上升沿时,会触发输入捕捉中断,然后在中断服务函数中计算周期和脉宽。由于输入捕捉中断可能在矩形波信号的高电平或低电平上触发,因此我们需要使用两个ICValue变量来分别保存上升沿和下降沿的计数值,并在计算周期和脉宽时进行判断。最后,我们可以在主函数中通过CaptureValue变量来获取测量结果。
阅读全文