分享知识使我快乐!
前言
本文主要讲解如何从0开始完成示波器的设计,如需源码,请在评论区留言邮箱,看到后会发送。
一、实验介绍
(1)实验目的
- 能够在2.8寸TFT彩屏上正确显示波形
- 支持通过按键实现波形的放大与缩小
- 支持测量引脚输入电压
- 支持输出1KHz~10KHz方波信号
- 支持通过按键调整占空比和频率
- 支持测量自身频率和占空比
(2)STM32硬件资源
以下是本次实验主要用到的芯片功能
- 定时器的输出比较和输入捕获
- ADC模数转换
- DMA数据搬运
(3)硬件环境
- 正点原子STM32F103ZET6开发板
- 面包板
- 2.8寸TFTLCD
- 杜邦线若干
二、硬件介绍
1.实物图
2.引脚连接
PA0 ADC模数转换采样引脚
PA1 PWM方波输出比较引脚
PA6 定时器输入捕获引脚
PA0 ---- PA1
PA6 ---- PA1
因为PA1只有一个引脚,故使用了面包板进行外接
三、软件介绍
1.软件框图
2.PWM输出比较代码
以下函数为PWM输出初始化函数
/*
* 函 数:PWM初始化函数
* 参 数:PSC;预分频系数
* 返 回 值:无
* 注意事项:PSC和ARR共同决定频率,此函数仅设置PSC的值,并不直接是频率
* 频率Freq = CK_PSC / (PSC + 1) / (ARR + 1)
*/
void PWM_Init(uint16_t PSC)
{
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_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2); //定时器2为时钟源
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 - 1,方便更直观地观察占空比
TIM_TimeBaseInitStructure.TIM_Prescaler = PSC - 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_OCPolarity_High; //高电平为有效电平,用于对占空比的计算
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruc