完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大佬,新人初学嵌入式,现在在配一个ADC采样,配置timer1通道1,2,3输出三路PWM,现在想要用Timer3TRGO通道触发ADC,ADC在三路输出PWM高电平中间点采样,该如何配置呢?目前搜索得到的配置方式是Timer1配置成中央对齐方式,然后ADC使能外部触发,为了观察是否在高电平中间点采样,在ADC中断做了一个IO口翻转操作,现在观察PWM和IO口波形,发现IO口翻转还是在PWM高电平上升沿时出现,请教一下各位大佬 该怎么配置呢
|
|
相关推荐
3个回答
|
|
我猜测有可能应用要在MOS管打开后稳定时采集相电流的需要吧~
|
|
|
|
没有更新事件触发ADC的话,中央对其方式就有点行不通。 那么换成单边模式,将ADC设为注入通道,用定时器1的通道4比较信号触发,就是每次都要根据PWM的脉宽计算一下
|
|
|
|
要实现在三路PWM高电平中间点采样,可以按照以下步骤进行配置:
1. 配置Timer3的TRGO事件为PWM高电平中间点触发: - 设置Timer3的工作模式为中央对齐模式(CENTER_ALIGNED_MODE)。 - 设置Timer3的极性为反向(OCPolarity_High)。 - 配置Timer3的CCR寄存器来设置PWM的占空比,确保PWM在高电平中间点触发TRGO事件。 2. 配置ADC: - 启用ADC的外部触发模式(使用TIM3_TRGO作为外部触发源)。 - 设置ADC的触发源为外部触发模式(使用ADC_ExternalTrigConv_T3_TRGO作为触发源)。 - 配置ADC的通道和其他参数。 3. 在ADC的转换完成中断中进行采样,在高电平中间点翻转IO口: - 设置ADC的转换完成中断使能。 - 在ADC转换完成中断中翻转IO口的状态。 请注意,由于IO口翻转操作是在ADC转换完成中断中执行的,因此可能会有一定的延迟。如果需要更精确的采样,可以考虑使用DMA方式进行ADC数据的采集。 以下是一种可能的配置代码示例(基于HAL库): ```c // 配置Timer3 TIM_HandleTypeDef htim3; void MX_TIM3_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; htim3.Init.Period = 999; // 适当设置PWM周期 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.RepetitionCounter = 0; HAL_TIM_PWM_Init(&htim3); sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig); sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF; // PWM高电平中间点触发TRGO sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig); } // 配置ADC ADC_HandleTypeDef hadc1; void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig; hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO; // 外部触发模式使用TIM3_TRGO hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; HAL_ADC_Init(&hadc1); sConfig.Channel = ADC_CHANNEL_0; // 设置ADC转换通道 sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5; // 建议合适的采样时间 HAL_ADC_ConfigChannel(&hadc1, &sConfig); } // ADC转换完成中断回调函数 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { // 在转换完成中断中翻转IO口状态 HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); } int main(void) { HAL_Init(); MX_TIM3_Init(); MX_ADC1_Init(); // 启动Timer3 PWM输出 HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); // 启动ADC转换 HAL_ADC_Start_IT(&hadc1); while (1) { // 主循环中可以进行其他操作 } } ``` 请根据具体的硬件电路和需求进行适当的修改和调整。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1627 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1550 浏览 1 评论
984 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
688 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1601 浏览 2 评论
1867浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
650浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
518浏览 3评论
536浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
506浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 13:42 , Processed in 0.664450 second(s), Total 53, Slave 47 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号