STM32正弦波产生学习-23.7.4

生成正弦函数

 选择型号

 

设置烧写器

设置外部晶振

 时钟

DAC

 

Tim6

 

设置周期

外部晶振的周期为72MHz 1s跳动72000000次  要生成一个50Hz的正弦波

72000000/50=1440000   每一个正弦波周期晶振跳动的次数为:1440000

把一个正弦波周期分为10份,每一份跳动的次数为144000

Preascaler:分频器   

Counter Period是指计数器的周期,也可以称为自动重装寄存器(Auto-Reload Register)的值。在计数器中,当计数器达到或超过Counter Period时,计数器会重新从0开始计数,形成一个循环

 

"TIM6 global interrupt" 是指基于TIM6定时器的全局中断。在使用STM32系列微控制器时,您可以配置TIM6定时器,在达到一定计数值或满足特定条件时触发中断。

"DAC1和DAC3通道下溢错误中断" 是指与DAC1和DAC3模块相关的通道下溢错误中断。DAC(数字模拟转换器)是将数字信号转换为模拟信号的外设。在某些情况下,当DAC1或DAC3的输出值低于其最小值或零值时,可能会触发通道下溢错误中断。

这两个中断都是与STM32系列微控制器的外设相关的中断。TIM6定时器的中断可用于实现时间延迟、定时任务等功能;DAC通道下溢错误中断用于检测和处理DAC输出的异常情况。

 

 

 

 

STM32产生正弦波可以使用DAC或者PWM输出模式,下面给出两种实现方式: ## 使用DAC 1. 配置DAC ```c DAC_HandleTypeDef hdac; void MX_DAC_Init(void) { DAC_ChannelConfTypeDef sConfig = {0}; hdac.Instance = DAC1; if (HAL_DAC_Init(&hdac) != HAL_OK) { Error_Handler(); } sConfig.DAC_Trigger = DAC_TRIGGER_NONE; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE; if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK) { Error_Handler(); } } ``` 2. 产生正弦波数据 ```c #define SAMPLE_NUM 100 #define PI 3.1415926f uint16_t sineWave[SAMPLE_NUM]; void createSinWave(void) { for(uint8_t i=0;i<SAMPLE_NUM;i++) { sineWave[i]=(uint16_t)(2048.0f*(1.0f+sinf(2.0f*PI*i/SAMPLE_NUM))); } } ``` 3. 启动DAC,并输出正弦波数据 ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6) { HAL_DAC_Start(&hdac, DAC_CHANNEL_1); HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, sineWave[counter]); counter++; if (counter >= SAMPLE_NUM) counter = 0; } } ``` ## 使用PWM 1. 配置PWM ```c TIM_HandleTypeDef htim2; void MX_TIM2_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 799; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 399; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_MspPostInit(&htim2); } ``` 2. 产生正弦波数据 ```c #define SAMPLE_NUM 100 #define PI 3.1415926f uint16_t sineWave[SAMPLE_NUM]; void createSinWave(void) { for(uint8_t i=0;i<SAMPLE_NUM;i++) { sineWave[i]=(uint16_t)(399.0f*(1.0f+sinf(2.0f*PI*i/SAMPLE_NUM))); } } ``` 3. 启动PWM,并输出正弦波数据 ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6) { HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, sineWave[counter]); counter++; if (counter >= SAMPLE_NUM) counter = 0; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值