OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3851|回复: 3

請問STM32F103如何使用TIMER2觸發??

[复制链接]

52

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2018-10-17
在线时间
40 小时
发表于 2022-3-25 17:53:19 | 显示全部楼层 |阅读模式
1金钱
請問各位,我使用正點原子STMF103的開發板我利用Timer3弄成PWM四個通道的輸出,使用軟體
觸發方式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
利用PA.1外接可變電阻,調整可變電阻可以改變PWM的空佔比,到目前都沒有問題


那請問,假如我不使用軟體觸發,也不使用DMA,我想要用成TIMER2外部觸發方式.就是我調整
我的PA.1可變電阻的時候他才會觸發,請問這應該要怎麼做,因為目前軟體觸發的方式
好像比較耗電,就是時時刻刻都在抓電阻值.
請問有現成的範例可以給我參考嗎???



#include "adc.h"
#include "delay.h"
#include "timer.h"
#include "lcd.h"
#include "stm32f10x_it.h"
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5       
//////////////////////////////////////////////////////////////////////////////////         
//¥»μ{§Ç¥u¨Ñ¾Ç2ߨÏ¥ΡA¥¼¸g§@aì3\¥i¡A¤£±o¥Ωó¨ä¥|¥ô|ó¥Î3~
//ALIENTEK¾ÔÄ¥STM32¶}μoaO
//ADC ¥N½X          
//¥¿ÂI-ì¤l@ALIENTEK
//§T3N½×¾Â:www.openedv.com
//-קï¤é′á:2012/9/7
//a©¥»¡GV1.0
//a©Åv©ò|3¡Aμsa©¥2¨s¡C
//Copyright(C) ¼s|{¥«&#172ál1q¤l¬ì§T|3--¤½¥q 2009-2019
//All rights reserved                                                                          
//////////////////////////////////////////////////////////////////////////////////
          
                  
//aì©l¤ÆADC
//3o¸ì§ú-ì¶è¥H3W«h3q1D¬°¨ò
//§ú-ìàq»{±N¶}±ò3q1D0~3                                                                                                                                          
void  Adc_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //¨ÏˉàADC13q1D®éÄá
        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //3]¸mADC¤ààW|]¤l6 72M/6=12,ADC3ì¤j®é¶¡¤£ˉà¶W1L14M

        //PA1 §@¬°¼òàà3q1D¿é¤J¤T¸}                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //¼òàà¿é¤J¤T¸}
        GPIO_Init(GPIOA, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  //′_|ìADC1

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC¤u§@¼ò|¡:ADC1©MADC2¤u§@|b¿W¥ß¼ò|¡
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;        //¼ò¼ÆÂà′«¤u§@|b3æ3q1D¼ò|¡
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //¼ò¼ÆÂà′«¤u§@|b3æ|¸Âà′«¼ò|¡
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //Âà′«¥Ñ3n¥ó|󤣬O¥~3¡Ä2μo±ò°ê
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC¼Æ¾ú¥k1ï»ô
        ADC_InitStructure.ADC_NbrOfChannel = 1;        //¶¶§Ç¶i|æ3W«hÂà′«aoADC3q1Dao¼Æ¥Ø
        ADC_Init(ADC1, &ADC_InitStructure);        //®ú¾úADC_InitStruct¤¤«ü©wao°Ñ¼Æaì©l¤Æ¥~3]ADCxao±H|s¾1   

        ADC_Cmd(ADC1, ENABLE);        //¨Ïˉà«ü©waoADC1
       
        ADC_ResetCalibration(ADC1);        //¨Ïˉà′_|ì®Õ·Ç  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //쥫Y′_|ì®Õ·Çμ2§ô
       
        ADC_StartCalibration(ADC1);         //¶}±òAD®Õ·Ç

        while(ADC_GetCalibrationStatus(ADC1));         //쥫Y®Õ·Çμ2§ô

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //¨Ïˉà«ü©waoADC1ao3n¥óÂà′«±ò°ê¥\ˉà

}                                  
//àò±oADC-è
//ch:3q1D-è 0~3
u16 Get_Adc(u8 ch)   
{
          //3]¸m«ü©wADCao3W«h2Õ3q1D¡A¤@-ó§Ç|C¡A±Ä¼Ë®é¶¡
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_71Cycles5 );        //ADC1,ADC3q1D,±Ä¼Ë®é¶¡¬°239.5¶g′á                                      

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //¨Ïˉà«ü©waoADC1ao3n¥óÂà′«±ò°ê¥\ˉà       
         
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//쥫YÂà′«μ2§ô

        return ADC_GetConversionValue(ADC1);        //ae|^3ìañ¤@|¸ADC13W«h2ÕaoÂà′«μ2aG
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
        u32 temp_val=0;
        u8 t;
        for(t=0;t<times;t++)
        {
                temp_val+=Get_Adc(ch);
                delay_ms(5);
        }
        return temp_val/times;
}          
void TIM2_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //&#174;é&#196;á¨&#207;ˉà
        //&#169;w&#174;é&#190;1TIM2aì&#169;l¤&#198;
        TIM_TimeBaseStructure.TIM_Period = arr; //3]&#184;m|b¤U¤@-ó§ó·s¨&#198;¥ó&#184;&#203;¤J&#172;&#161;°êao|&#219;°ê-&#171;&#184;&#203;&#184;ü±H|s&#190;1&#182;g′áao-è       
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //3]&#184;m¥&#206;¨ó§@&#172;°TIMx&#174;é&#196;áàW2v°£&#188;&#198;ao1w¤ààW-è
        TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; //3]&#184;m&#174;é&#196;á¤à3&#206;:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;  //TIM|V¤W-p&#188;&#198;&#188;ò|&#161;
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //&#174;ú&#190;ú&#171;ü&#169;wao°&#209;&#188;&#198;aì&#169;l¤&#198;TIMxao&#174;é&#182;&#161;°ò&#188;&#198;3&#230;|ì
       
       
        //¤¤&#194;_àu¥yˉ&#197;NVIC3]&#184;m
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //¨&#207;ˉà&#171;ü&#169;waoTIM2¤¤&#194;_,¤13\§ó·s¤¤&#194;_
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  ;  //TIM2¤¤&#194;_
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //¥y|&#251;àu¥yˉ&#197;0ˉ&#197;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;  //±qàu¥yˉ&#197;2ˉ&#197;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ3q1D3Q¨&#207;ˉà
        NVIC_Init(&NVIC_InitStructure);  //aì&#169;l¤&#198;NVIC±H|s&#190;1
        TIM_Cmd(TIM2, ENABLE);  //¨&#207;ˉàTIMx                                         
}
void TIM2_IRQHandler(void)   //TIM3??
{
  u16 adcx;
        float temp;
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //??TIM3????????
                {
                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //??TIMx??????
     adcx=Get_Adc_Average(ADC_Channel_1,10);
                delay_ms(50);       
                 
                TIM3_PWM_Init(adcx,adcx,adcx,adcx);
               
                LCD_ShowxNum(156,130,adcx,4,16,0);//&#197;&#227;¥üADCao-è
                temp=(float)adcx*(3.3/4096);
                adcx=temp;
                LCD_ShowxNum(156,150,adcx,1,16,0);//&#197;&#227;¥ü1qà£-è,&#197;&#227;¥ü1qà£-ó|ì&#188;&#198;-è
                temp-=adcx;
                temp*=1000;
                LCD_ShowxNum(172,150,temp,3,16,0X80);//&#197;&#227;¥ü1qࣤp&#188;&#198;
         //        LED0=!LED0;
               
          LCD_ShowString(60,250,200,24,24,"hunkchen2000@gmail.com");          
                LED0=!LED0;
                }
}


Image 6.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2022-3-25 19:41:06 | 显示全部楼层
回复

使用道具 举报

52

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
249
金钱
249
注册时间
2018-10-17
在线时间
40 小时
 楼主| 发表于 2022-3-25 23:53:25 | 显示全部楼层
樓上的這個我知道,但是我不要用到DMA阿
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2022-3-26 13:14:53 | 显示全部楼层
hunkchen2000 发表于 2022-3-25 23:53
樓上的這個我知道,但是我不要用到DMA阿

重点是ADC的配置 开启外部触发转换 通过定时器产生的一个事件触发ADC转换
不用DMA的话就删掉他有关DMA的部分 然后通过检测ADC转换的标志或者中断之类的把转换结果取出来不就行了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 20:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表