This can be done in exactly five questions every time, provided your first question can find you at least one non-normal. Thanks to @Evan for already providing such a question.
Why is this helpful? Because now we could show our non-normal (let's assume it's B) any statement, XOR it with "B is a Knave", and be certain that our answer was the truth. As you can see, if B has to be a Knight or a Knave:
B Knight, XYZ True: [XYZ] XOR [B Knave] is True, so B says "True"
B Knight, XYZ False: [XYZ] XOR [B Knave] is False, so B says "False"
B Knave, XYZ True: [XYZ] XOR [B Knave] is False, so B says "True"
B Knave, XYZ False: [XYZ] XOR [B Knave] is True, so B says "False"
As a result, every statement can split the set of cases exactly in half by making a statement that is true for exactly half of them. And, conveniently, there are exactly 16 cases once we know somebody is not normal - again assuming B is not normal:
(A has 3 choices) x (B has 2 choices) x (C has 3 choices) = 18 possible cases, but Normal Knave Normal and Normal Knight Normal break the rules, so only 16 of those cases are valid.
Thus, our initial question statement leaves us with 16 cases, a second statement (if well chosen) can leave us with 8 cases for each answer, the third leaves us with 4 per set of answers, the fourth leaves us with 2, and the fifth uniquely identifies our situation. Now that we know it's possible, we simply need to find a set of statements that encompasses all possible strings of true/false answers - which, for five consecutive statements is 2^5 = 32 possibilities. I'll be going for simplicity over clarity, so my statements will not all follow the form "XYZ" XOR "Letter is a Knave", though they could be formatted as such if one wished.
I'll create some notation here for efficiency:
[Number][Truth Values][Person]:[Statement]
This is the [Number]'th statement shown, in the event that the previous sequential answers were the [Truth Values] indicated, it is being shown to [Person], and the statement is [Statement]. If one can determine all of the roles given a resulting truth value for a statement, I will denote it as:
[Number][Truth Values][Person][Single Truth Value] - [A Role], [B Role], [C Role]
Where [Single Truth Value] was [Person]'s response to statement [Number] with previous answers of [Truth Values]. Note that a conclusion may show up multiple times by way of different paths.
[Letter] [Role] is an assertion that [Letter] is [Role]
Example:
A is a Normal
I ask A if A is a Knight, and A says Yes. I ask A if A is a Knight a second time, and A says No. This is recorded as:
1A: [A Knight]
2TA: [A Knight]
2TAF - Normal
Now, the statements:
1A: [A Knight AND B NotNormal] OR [A NotKnight AND B Normal]
2TB: [A Knave OR C Normal] XOR [B Knave]
3TTA: [B Knight] XOR [A Knave]
4TTTB: [C Normal]
5TTTTB: [A Knight]
5TTTTBT - Knight, Knight, Normal
5TTTTBF - Knave, Knight, Normal
5TTTFB: [C Knight]
5TTTFBT - Knave, Knight, Knight
5TTTFBF - Knave, Knight, Knave
4TTFB: [C Normal]
5TTFTB: [C Knight]
5TTFTBT - Knave, Knave, Knave
5TTFTBF - Knave, Knave, Knight
5TTFFB: [A Knight]
5TTFFBT - Knave, Knave, Normal
5TTFFBF - Knight, Knave, Normal
3TFB: [C Knight] XOR [B Knave]
4TFTC: [A Knight]
5TFTTC: [B Knight]
5TFTTCT - Knight, Knight, Knight
5TFTTCF - Knight, Knave, Knight
5TFTFC: [B Knight]
5TFTFCT - Normal, Knight, Knight
5TFTFCF - Normal, Knave, Knight
4TFFC: [A Knight]
5TFFTC: [B Knight]
5TFFTCT - Normal, Knave, Knave
5TFFTCF - Normal, Knight, Knave
5TFFFC: [B Knight]
5TFFFCT - Knight, Knave, Knave
5TFFFCF - Knight, Knight, Knave
2FC: [A Knave OR B Normal] XOR [C Knave]
3FTA: [C Knight] XOR [A Knave]
4FTTC: [B Normal]
5FTTTC: [A Knight]
5FTTTCT - Knight, Normal, Knight
5FTTTCF - Knave, Normal, Knight
5FTTFC: [B Knight]
5FTTFCT - Knave, Knight, Knight
5FTTFCF - Knave, Knave, Knight
4FTFC: [B Normal]
5FTFTC: [B Knight]
5FTFTCT - Knave, Knave, Knave
5FTFTCF - Knave, Knight, Knave
5FTFFC: [A Knight]
5FTFFCT - Knave, Normal, Knave
5FTFFCF - Knight, Normal, Knave
3FFC: [B Knight] XOR [C Knave]
4FFTB: [A Knight]
5FFTTB: [C Knight]
5FFTTBT - Knight, Knight, Knight
5FFTTBF - Knight, Knight, Knave
5FFTFB: [C Knight]
5FFTFBT - Normal, Knight, Knight
5FFTFBF - Normal, Knight, Knave
4FFFB: [A Knight]
5FFFTB: [C Knight]
5FFFTBT - Normal, Knave, Knave
5FFFTBF - Normal, Knave, Knight
5FFFFB: [C Knight]
5FFFFBT - Knight, Knave, Knave
5FFFFBF - Knight, Knave, Knight
To use this list, just show the first statement to the indicated person (in this case, A) - if you get a T, jump to 2T and show that statement to the indicated person, if you get a false, jump to 2F and show that statement to that indicated person instead. Continue on until you get an answer for your fifth statement, all possibilities of which lead to conclusions. You can test the veracity of these conclusions by picking any case (A = ?, B = ?, C = ?) and running through the questions to confirm that you end up at the correct conclusion.