AnsweredAssumed Answered

Reading PPM Sum signal not working

Question asked by weggler.patrick on Dec 7, 2014
Latest reply on Dec 8, 2014 by weggler.patrick
Hi,

I'm trying to read a PP Sum Signal with the TIM3_CH4 of my stm32f103rb.
The signal of the first channel is recognizable but not steady.

What am I doing wrong.
TIM3 CH1 2 3 and TIM1 CH2 3 have been used to output the corresponding PWM Signals.

001.void initPPM(void) {
002.    GPIO_InitTypeDef GPIO_InitStructure;
003.    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
004.    TIM_OCInitTypeDef  TIM_OCInitStructure;
005. 
006.    //enable port B and alternate function
007.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
008. 
009.    //remap ports
010.    GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);
011. 
012.    //set clock to TIM3
013.    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
014.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
015. 
016.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
017.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
018. 
019.    //init port C pin 6 = TIM3 channel 1 to alternate function push-pull
020.    //init port C pin 7 = TIM3 channel 2 to alternate function push-pull
021.    //init port C pin 8 = TIM3 channel 3 to alternate function push-pull
022. 
023. 
024.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;
025.    GPIO_Init(GPIOC, &GPIO_InitStructure);
026. 
027. 
028. 
029.    //init port b15 TIM1 channel 3N
030.    //init port b14 TIM1 channel 2N
031. 
032.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;
033.    GPIO_Init(GPIOB, &GPIO_InitStructure);
034. 
035. 
036. 
037.    //Init Timer3 und 1 Baseconfig
038.    TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
039.    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
040.    TIM_TimeBaseStructure.TIM_Period = 20000;
041.    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
042. 
043.    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
044.    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
045. 
046. 
047. 
048.    //Init Channels
049.    TIM_OCStructInit(&TIM_OCInitStructure);
050.    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
051.    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
052.    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
053.    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
054.    TIM_OCInitStructure.TIM_Pulse = 1500;
055. 
056.    TIM_OC1Init(TIM3,&TIM_OCInitStructure);
057.    TIM_OC2Init(TIM3,&TIM_OCInitStructure);
058.    TIM_OC3Init(TIM3,&TIM_OCInitStructure);
059. 
060.    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
061.    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
062.    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
063. 
064.    TIM_OC2Init(TIM1,&TIM_OCInitStructure);
065.    TIM_OC3Init(TIM1,&TIM_OCInitStructure);
066. 
067.    TIM_CtrlPWMOutputs(TIM1, ENABLE);
068. 
069.    TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
070.    TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
071. 
072.    TIM_ARRPreloadConfig(TIM1, ENABLE);
073.    TIM_ARRPreloadConfig(TIM3, ENABLE);
074.    TIM_Cmd(TIM1, ENABLE);
075.    TIM_Cmd(TIM3, ENABLE);
076. 
077.    //little hack
078.    TIM1->CCER |=(1<<6)|(1<<7)|(1<<10)|(1<<11);
079. 
080.}
081.void initPPMin(void) {
082.    GPIO_InitTypeDef GPIO_InitStructure;
083.    TIM_ICInitTypeDef  TIM_ICInitStructure;
084. 
085.    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
086.    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
087.    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
088.    GPIO_Init(GPIOC, &GPIO_InitStructure);
089. 
090. 
091.    TIM_ICStructInit(&TIM_ICInitStructure);
092. 
093.    //Init Kanäle
094.    TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
095.    TIM_ICInitStructure.TIM_ICFilter = 0xf;
096.    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
097.    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
098. 
099.    TIM_ICInit(TIM3,&TIM_ICInitStructure);
100. 
101.    NVIC_InitTypeDef NVIC_InitStructure;
102.    /* Enable the TIM2 gloabal Interrupt */
103.    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
104.    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7;
105.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
106.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
107.    NVIC_Init(&NVIC_InitStructure);
108. 
109.    NVIC_EnableIRQ(TIM3_IRQn);//HIER
110. 
111.    TIM_ITConfig(TIM3,TIM_IT_CC4,ENABLE);
112.}
113. 
114. 
115.void TIM3_IRQHandler(void) {
116.    if (TIM3->SR & TIM_IT_Update) {
117.        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
118.    }
119.    if (TIM3->SR & TIM_IT_CC4) {
120.        /* Clear TIM3_CH4 Capture compare interrupt pending bit */
121.        TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
122.        uint16_t tmp = TIM_GetCapture4(TIM3);
123.        if (tmp > captureValueOld) {
124.            currentPPMin = tmp - captureValueOld;
125.        } else {
126.            currentPPMin = captureValueOld + (20000 - tmp);
127.        }
128. 
129.        currentPPMin -= 400;   //the low time is allays 400µs
130.        captureValueOld = tmp;
131.        switch (currentState) {
132.        case 0:
133.        case 1:
134.        case 2:
135.        case 3:
136.        case 4:
137.        case 5:
138.        case 6:
139.            if (currentPPMin < 200) {
140.                //too short - glitch
141.            } else if (currentPPMin > 5200) {
142.                //too long reset
143.                currentState = 0;
144.            } else {
145.                ppmSum[currentState] = currentPPMin;
146.                currentState++;
147.            }
148.            break;
149.        case 7:
150.            if (currentPPMin < 800) {
151.                //too short - glitch
152.            } else if (currentPPMin > 2200) {
153.                //too long reset
154.                currentState = 0;
155.            } else {
156.                ppmSum[currentState] = currentPPMin;
157.                currentState = 0;
158.            }
159.            break;
160.        default:
161.            break;
162.        }
163. 
164.    }
165.    if (TIM3->SR & TIM_IT_CC3) {
166.        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
167.    } else {
168.        printf("missed %u \r\n", TIM3->SR);
169.        TIM3->SR = 0xffff;
170.    }
171. 
172.}

Instead of reading 8 channel with 1500 each I read values like:
01.printf("%d \t %d \t %d \t %d \t %d \t %d \t %d \t %d\r\n",ppmSum[0],ppmSum[1],ppmSum[2],ppmSum[3],ppmSum[4],ppmSum[5],ppmSum[5],ppmSum[6],ppmSum[7]);
02. 
03.0    0   0   0   0   0   0   0
04.1103     0   0   0   0   0   0   0
05.1215     0   0   0   0   0   0   0
06.1717     0   0   0   0   0   0   0
07.2229     0   0   0   0   0   0   0
08.428      0   0   0   0   0   0   0
09.428      0   0   0   0   0   0   0
10.240      0   0   0   0   0   0   0
11.2654     0   0   0   0   0   0   0
12.510      0   0   0   0   0   0   0
13.510      736     0   0   0   0   0   0
14.246      736     0   0   0   0   0   0
15.246      736     0   0   0   0   0   0
16.1171     736     0   0   0   0   0   0
17.893      736     0   0   0   0   0   0
18.312      736     0   0   0   0   0   0
19.566      736     0   0   0   0   0   0
20.513      736     0   0   0   0   0   0
21.1147     736     0   0   0   0   0   0
22.1029     736     0   0   0   0   0   0
23.282      736     0   0   0   0   0   0
24.282      736     0   0   0   0   0   0
25.888      736     0   0   0   0   0   0
26.680      736     0   0   0   0   0   0
27.230      346     0   0   0   0   0   0
28.230      302     1647    0   0   0   0   0
29.1449     302     1647    0   0   0   0   0
30.1744     302     1647    0   0   0   0   0
31.1744     1439    256     0   0   0   0   0
32.501      552     256     0   0   0   0   0
33.659      552     256     0   0   0   0   0
34.860      552     256     0   0   0   0   0
35.860      552     256     0   0   0   0   0
36.860      552     256     0   0   0   0   0
37.860      552     256     0   0   0   0   0
38.860      552     256     0   0   0   0   0
39.860      552     256     0   0   0   0   0
40.665      869     256     0   0   0   0   0
41.665      869     256     0   0   0   0   0
42.665      869     256     0   0   0   0   0
43.519      869     256     0   0   0   0   0
44.725      869     256     0   0   0   0   0
45.896      869     256     0   0   0   0   0
46.433      864     256     0   0   0   0   0
47.433      864     256     0   0   0   0   0
48.1688     864     256     0   0   0   0   0
49.311      864     256     0   0   0   0   0
50.2816     864     256     0   0   0   0   0
51.299      1557    256     0   0   0   0   0
52.4082     317     256     0   0   0   0   0
53.544      317     256     0   0   0   0   0
54.544      317     256     0   0   0   0   0
55.639      317     256     0   0   0   0   0
56.916      665     256     0   0   0   0   0
57.1039     665     256     0   0   0   0   0
58.311      665     256     0   0   0   0   0
59.1354     665     256     0   0   0   0   0
60.359      665     256     0   0   0   0   0
61.359      444     256     0   0   0   0   0
62.873      444     256     0   0   0   0   0
63.303      444     256     0   0   0   0   0
64.303      444     256     0   0   0   0   0
65.1837     444     256     0   0   0   0   0
66.509      444     256     0   0   0   0   0
67.1704     444     256     0   0   0   0   0
68.1704     1661    731     2401    0   0   0   0
69.1704     1661    731     2401    0   0   0   0
70.1704     1661    731     2401    0   0   0   0
71.303      1661    731     2401    0   0   0   0
72.599      1661    731     2401    0   0   0   0
73.391      1661    731     2401    0   0   0   0
74.391      1661    731     2401    0   0   0   0

 

Outcomes